Codeforces Round #281 (Div. 2) 解题报告(A B C D)

        这场比赛真是大起大落。。比的时候一度排在rank1,以为从此达到人生巅峰了,结果最后B,C都FST了,都是因为很2的错误,B为了偷懒,居然把数加到string里比较字典序。C漏一个"=",而且有语句写错了位置。

        CF题的难度,好像有变水的趋势。。以前前3题没算法,现在前4题都没有,而且还没编程复杂度。。


A. Vasya and Football

        思路:给每个人领牌数计数,黄牌+1,红牌+2。拿黄牌时,如果计数器为2则输出,拿红牌时,如果计数器为2或3则输出。


#include<iostream>  
#include<queue>  
#include<map>  
#include<set>  
#include<vector>  
#include<algorithm>  
#include<string.h>  
#include<cstdio>  
  
using namespace std;  
  
#define ll long long  
#define INF 1000000000

int cnt[210];
int main(){
	
	string h;
	string a;
	cin>>h>>a;
	
	int n;
	cin>>n;
	map<string,int> mp;
	for(int i=1;i<=n;i++){
		int t;
		string x;
		int id;
		string y;
		
		cin>>t>>x>>id>>y;
		if(y=="r"){
			if(x=="h"){
				cnt[id]+=2;
				if(cnt[id]==2||cnt[id]==3){
					cout<<h;
					cout<<" "<<id<<" "<<t<<endl;
				}
			}else{
				cnt[id+100]+=2;
				if(cnt[id+100]==2||cnt[id+100]==3){
					cout<<a;
					cout<<" "<<id<<" "<<t<<endl;
				}
			}
		}else{
			if(x=="h"){
				cnt[id]++;
				if(cnt[id]==2){
					cout<<h;
					cout<<" "<<id<<" "<<t<<endl;
				}
			}else{
				cnt[id+100]++;
				if(cnt[id+100]==2){
					cout<<a;
					cout<<" "<<id<<" "<<t<<endl;
				}
			}
		}
	}
	
	return 0;
}


B. Vasya and Wrestling

        思路:模拟。先判断分高的,相同判断字典序,再相同判断最后一次动作。注意需要long long。


#include<iostream>  
#include<queue>  
#include<map>  
#include<set>  
#include<vector>  
#include<algorithm>  
#include<string.h>  
#include<cstdio>  
  
using namespace std;  
  
#define ll long long  
#define INF 1000000000

int a[200010];
int b[200010];

int main(){
	int n;
	ll suma=0;
	ll sumb=0;
	cin>>n;
	ll last;
	int ida=0;
	int idb=0;
	for(int i=1;i<=n;i++){
		ll t;
		scanf("%I64d",&t);
		if(t>0){
			suma+=t;
			a[ida++]=t;
		}else{
			sumb+=(-t);
			b[idb++]=-t;
		}
		if(i==n)last=t;
	}
	
	bool win;
	if(suma>sumb){
		win=1;
	}else if(suma<sumb){
		win=0;
	}else{
		int flag=0;
		for(int i=0;i<max(ida,idb);i++){
			if(a[i]<b[i]){
				flag=-1;break;
			}
			if(b[i]<a[i]){
				flag=1;break;
			}
		}
		
		if(flag==1){
			win=1;
		}else if(flag==-1){
			win=0;
		}else{
			if(last>0){
				win=1;
			}else{
				win=0;
			}
		}
	}
	
	if(win){
		cout<<"first"<<endl;
	}else{
		cout<<"second"<<endl;
	}
	return 0;
}

C. Vasya and Basketball

        思路:给所有球的距离排序,先让所有球都是三分,然后扫一遍,不断更改三分线,找出最有利的三分线就行了。


#include<iostream>  
#include<queue>  
#include<map>  
#include<set>  
#include<vector>  
#include<algorithm>  
#include<string.h>  
#include<cstdio>  
  
using namespace std;  
  
#define ll long long  
#define INF 1000000000

pair<int,bool> p[400010];


int main(){
    int n,m;
    cin>>n;
    for(int i=0;i<n;i++){
        scanf("%d",&p[i].first);
        p[i].second=1;
    }
    cin>>m;
    for(int i=n;i<n+m;i++){
        scanf("%d",&p[i].first);
        p[i].second=0;
    }
    sort(p,p+n+m);
    p[n+m].first=-1;
    ll as=(ll)n*3LL;
    ll bs=(ll)m*3LL;
    ll MAX=-1000000000000LL;
    ll ansa;
    ll ansb;
    
    for(int i=0;i<=n+m;i++){
        if(i==0||p[i].first!=p[i-1].first){
            if(as-bs>MAX){
                MAX=as-bs;
                ansa=as;
                ansb=bs;
            }
        }
        if(p[i].second==1){
            as--;
        }else{
            bs--;
        }
    }
    cout<<ansa<<":"<<ansb<<endl;
    
    return 0;
}


D. Vasya and Chess

        思路:判断奇偶,偶数白赢,第一步走1 2;奇数黑赢。白的最优决策,就是自己行动后保持和黑皇后横坐标的差为偶数,第一步往右,然后黑上下自己也上下,黑左右自己也左右,黑斜走自己也斜走。话说D题这么水,真的好吗。。


#include<iostream>  
#include<queue>  
#include<map>  
#include<set>  
#include<vector>  
#include<algorithm>  
#include<string.h>  
#include<cstdio>  
  
using namespace std;  
  
#define ll long long  
#define INF 1000000000

int main(){
    int n;
    while(cin>>n){
        if(n&1){
            cout<<"black"<<endl;
        }else{
            cout<<"white"<<endl;
            cout<<1<<" "<<2<<endl;
        }
    }
    return 0;
}


你可能感兴趣的:(codeforces)