题目题意:
一共有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();
}
}

京公网安备 11010502036488号