A. Secret Sport
题意:A与B选手在下棋,规定下赢X把看作赢一局,一共赢Y把的那个是最后的赢家。
思路:因为不知道x,y到底是多少,n的范围是到20,所以只需要枚举x即可,时间复杂度不高,注意的是,如果枚举结果是A赢,那么给定字符串的最后一个值一定是A,反之也是。
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n;
cin>>n;
string s;
cin>>s;
for(int i=1;i<=n;i++){
int ct=0,ct2=0;
int x=0,y=0;
for(int j=0;j<n;j++){
if(s[j]=='A')ct++;
else ct2++;
if(ct==i){
x++;
ct=0;
ct2=0;
}
if(ct2==i){
y++;
ct=0;
ct2=0;
}
}
if(x>y&&s[n-1]=='A'){
cout<<"A\n";
return;
}
if(x<y&&s[n-1]=='B'){
cout<<"B\n";
return;
}
}
cout<<"?\n";
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}
B. Two Out of Three
题意:给定一个数组,判断是否能构造出一个数组,满足给定条件中的三个中的两个?
思路:通过分析可得,要想满足下面条件中的两个,该数组就必须要有两个或两个以上相同的数超过两组
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
vector<int>p[N];
int ans[N];
void solve(){
int n;
cin>>n;
for(int i=1;i<=100;i++){
p[i].clear();
ans[i]=1;
}
for(int i=1;i<=n;i++){
int x;
cin>>x;
p[x].push_back(i);
}
int ct=0;
for(int i=1;i<=100;i++){
if(p[i].size()>=2&&ct==0){
for(auto c:p[i]){
ans[c]=2;
ct++;
break;
}
continue;
}
if(p[i].size()>=2&&ct>0){
for(auto c:p[i]){
ans[c]=3;
ct++;
break;
}
}
}
if(ct>=2){
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
cout<<"\n";
}else{
cout<<-1<<"\n";
}
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
for(int i=1;i<=t;i++)solve();
return 0;
}