Codeforces Round #679 (Div.2)

A. Finding Sasuke

n是偶数,输出相邻两个交换一个变负就可以了

#include <bits/stdc++.h>
using namespace std;
const int maxn=110;
int T;
int n;
int a[maxn];
int main(){
	cin>>T;
	while(T--){
		cin>>n;
		for(int i=0;i<n;i++){
			cin>>a[i];
		}
		for(int i=0;i<n;i+=2){
			printf("%d %d%c",a[i+1],-a[i],(i==n-2)?'\n':' ');
		}
	}
} 

B. A New Technique

数字没重复就直接通过两次输入的矩阵记录行列位置就可以了

#include <bits/stdc++.h>
using namespace std;
const int maxn=510;
int T;
int n,m;
int row[maxn*maxn];
int col[maxn*maxn];
int g[maxn][maxn];
int main(){
	cin>>T;
	int x;
	while(T--){
		cin>>n>>m;
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				cin>>x;
				col[x]=j;
			}
		}
		for(int j=0;j<m;j++){
			for(int i=0;i<n;i++){
				cin>>x;
				row[x]=i;
			}
		}

		for(int i=1;i<=n*m;i++){
			g[row[i]][col[i]]=i;
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				printf("%d%c",g[i][j],(j==m-1)?'\n':' ');
			}
		}
	}
	
} 

C. Perform Easily

暴力要么爆空间要么爆时间,看了题解才发现可以用set贪心

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n;
int a[10];
int b[maxn];
set<pair<int,int>>s;
int main(){
	for(int i=1;i<=6;i++)
		cin>>a[i];
	sort(a+1,a+7);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>b[i];
	}
	sort(b+1,b+n+1);
	int id[maxn];
	for(int i=1;i<=n;i++){
		id[i]=6;
		s.insert(make_pair(b[i]-a[id[i]],i));
	}
	int ans=(*s.rbegin()).first-(s.begin())->first;
	set<pair<int,int>>::iterator it;
	while(1){
		it=s.begin();
        int i=it->second;
        s.erase(it);
        if(id[i]==1) 
			break;
        id[i]--;
        s.insert({b[i]-a[id[i]],i});
        ans=min(ans,(*s.rbegin()).first-s.begin()->first);

	}
	cout<<ans<<endl;	
	
} 

D. Shurikens

倒叙模拟,看了别人的题解发现用优先队列更好一些

#include <bits/stdc++.h> 
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
int pre[maxn],cnt=0;
stack<int>st;
struct P{
	char op;
	int num; 
}shu[maxn];
int main()
{

  int n;
  cin>>n;
  for(int i=1;i<=2*n;i++){
  	char s;
	int num;
  	cin>>s;
  	if(s=='+'){
  		shu[i].op=s;	
	}
	else if(s=='-'){
		cin>>num;
		shu[i].op=s;
		shu[i].num=num;
	}
  }
  for(int i=2*n;i>=1;i--)
  {
	 if(shu[i].op=='-'&&(!st.empty()&&st.top()>shu[i].num||st.empty())){
	 	st.push(shu[i].num);
	 }
	 else if(shu[i].op=='+'){
	 	if(!st.empty())
	 	{
	 		pre[++cnt]=st.top();
	 		st.pop();
	 	}
	 }
	 else {
	 	cout<<"NO"<<endl;
		return 0;
	 }
  }
  if(!st.empty()){
  	cout<<"NO"<<endl;
	return 0;
  }
  cout<<"YES"<<endl; 
  for(int i=cnt;i>=1;i--){
  	cout<<pre[i]<<" ";
  }
  cout<<endl;
return 0;
}

E

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int T;
ll a,b,c,d;
int main(){
	cin>>T;
	while(T--){
		cin>>a>>b>>c>>d;
		if(a>b*c){
			cout<<-1<<endl;
			continue;
		}
		ll k=a/(b*d);
        printf("%lld\n",a*(k+1)-(1+k)*k/2*b*d);
	}
} 
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值