#include<bits/stdc++.h>
using namespace std;
int T,n;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> T;
while(T--){
map<int,vector<int>>mp;//注意到n的个数很大,不易开数组,有map的同时能快速确定最大值还能记住最大值的位置与数量
cin >> n;
string s(n,'0');//初始化长度为n的全0字符串
for(int i=0;i<n;i++){
int x;
cin >> x;
mp[x].push_back(i);
}
auto &[x,y]=*prev(mp.end());//prev取对象的前一个,需要取地址.&能避免拷贝,提升速度
int t=1;
//如果最大值全为偶数,每个人都有赢的机会,那么先前初始化方式就不适用了
if(y.size()%2==0){
t=-1;
s = string(n,'1');
}
for(auto &i:y){
s[i]+=t;
}
cout << s << endl;
}
}
错因:此题在思考的时候没有看懂题意,以为是一个人赢就可以,在赛后复盘的时候才发现是每一个人获胜的概率,解决问题的方向错了,最后只能走递归了
思路:既然是每一个人,那么就考虑每一个人赢的概率,一个人可能是最大的,也可能不是,所以赢的情况分两种进行讨论,当最大时,最大的人有奇数个就能赢,当一个人不是最大时,最大的先把其他人干完了,然后最大的人数有偶数个,那么就能赢

京公网安备 11010502036488号