对于这道题真是心痛,赛时我的想法是只有奇数个的最大的数字可以为1,但是其实不对,因为最大的数字可以先干掉次大的,所以这是不对的,第一个是我赛时的代码,思路不对,所以通过96.3%
#include <bits/stdc++.h>
using namespace std;
signed main(){
long long t;
cin>>t;
while (t--){
long long n,x;
cin>>n;
vector<long long>a;
vector<long long>b;
for (int i=0;i<n;i++){
cin>>x;
a.push_back(x);
b.push_back(x);//思路:弄个一样的数组排序,然后找里面出现奇数次的最大的数字,这样可以完美解决
}
sort(b.begin(), b.end(), greater<long long>());//从大到小排列更方便
long long y=n;
string s;
while(y--){
s+='0';
}
long long winner=-19;
long long i=0;
while(i<n){
long long j=i;
while(j<n&&b[j]==b[i]){
j++;//记录第i个数字出现的次数
}
long long count=j-i;//次数
if (count%2!=0){
winner=b[i];
break;//直接停止循环
}
i=j;//检查到第几个数字了,疑问:会不会第几个数字出问题,纸质简单计算一下。
}//无误
if (winner!=-19) {
for (int i=0;i<n;i++) {
if(a[i]==winner){
s[i]='1';
}
}
}
cout<<s;//注意换行
cout<<'\n';
s.clear();
}
return 0;
}
接下来是赛后,思路其实已经将明白了,就是如果最大的数字出现的次数是奇数,那么只有他为1,如果出现的次数是偶数,那么其他都可以为1,除了最大的那个数字 不过学到了一个s.assign(n,'0');//开销更小,值得提一下,这个是把字符串定义在外面,在循环里面更改,比直接在循环里面定义开销更小,接下来是代码
#include <bits/stdc++.h>
using namespace std;
signed main(){
long long t;
cin>>t;
string s;
while (t--){
long long max=0,cont=0;
long long n,x;
cin>>n;
vector<long long>a;
for (int i=0;i<n;i++){
cin>>x;
a.push_back(x);
if(x>max){
max=x;
cont=1;
}else if(x==max){
cont++;
}
}
//string s(n,'0');
s.assign(n,'0');//开销更小
long long i=0;
while(i<n){
if(a[i]==max&&cont%2!=0){
s[i]='1';
}else if(cont%2==0&&a[i]!=max){
s[i]='1';
}
i++;
}
cout<<s;//注意换行
cout<<'\n';
}
return 0;
}

京公网安备 11010502036488号