题目题意

一共有n名选手,每个选手做出来的Pizza都有一个美味值。在每轮比赛中,我们会在未淘汰中的人中任意选取2个人,如果这两个人的美味值不同,那么美味值低的将会被淘汰,否则两个人均会被淘汰,直至所有人被淘汰或者仅有一个人未被淘汰掉。

题目要求

需要我们判断哪些人在比赛中最后有可能会留到最后,如果能留到最后的,输出1,否则,输出0。

题目分析

既然题目中提到如果两个人的美味值相同,二人均淘汰,否则淘汰其较小值,我们就可以想到,如果最大值的个数为奇数,那么其余比他小数将会被全部淘汰,而与最大值相同的选手都将有可能被留到最后;而如果最大值的个数为偶数,无论怎样最大值一定都会被淘汰掉,那么其余所有的值都可以利用这个最大值去将别的数淘汰掉,而自己留到最后,所以,在这种情况下,除了最大值,其余的值都将有可能被留到最后。

那么根据这个思路,我们可以先去找这个最大值maxx:

	int maxx=0;  //因为美味值的最小值为1,所以我们的maxx可以直接定义为0
    for(int i=1;i<=n;i++){
        cin>>a[i];  
        maxx=max(maxx,a[i]);  //找到最大值
    }

随后我们就可以去计数我们的最大值cnt:

	int cnt=0;
    for(int i=1;i<=n;i++){
        if(a[i]==maxx) cnt++;
    }

之后我们就可以根据cnt的奇偶性来讨论,此处我直接用循环来输出:

	//当最大值个数为奇数时
	if(cnt%2){
        for(int i=1;i<=n;i++){
            if(a[i]==maxx) cout<<"1";
            else cout<<"0";
        }   
    }
	//当最大值个数为偶数时
	else{
        for(int i=1;i<=n;i++){
            if(a[i]!=maxx) cout<<"1";
            else cout<<"0";
        }
    }

完整代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[200010];
void solve(){
    int n;
    cin>>n;
    int maxx=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        maxx=max(maxx,a[i]);
    }
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(a[i]==maxx) cnt++;
    }
    if(cnt%2){
        for(int i=1;i<=n;i++){
            if(a[i]==maxx) cout<<"1";
            else cout<<"0";
        }
    }else{
        for(int i=1;i<=n;i++){
            if(a[i]!=maxx) cout<<"1";
            else cout<<"0";
        }
    }
    cout<<endl;
}
int main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}