题目链接
a,b各控了我半小时,后面博弈就没想出来了
A
大于等于 k k k的全能消去变成 k − 1 k-1 k−1,再去结合小于 k k k的也全能消去变成 k − 1 k-1 k−1
void solve()
{
int n,k;cin>>n>>k;
vector<int>a(n+1);
bool flag=1;
map<int,int>mp;
for(int i=1;i<=n;i++){
cin>>a[i];
mp[a[i]]++;
if(mp[a[i]]>=k)flag=0;
}
if(flag||n==1){cout<<n<<'\n';return;}
cout<<k-1<<'\n';
}
B
只需要判断,是否每条边都有B或W就行了
void solve()
{
int n,m;cin>>n>>m;
vector<string>mv(n+1);
for(int i=1;i<=n;i++)cin>>mv[i];
map<char,int>mp;
for(int i=0;i<m;i++){
if(mv[1][i]=='B'){mp['B']++;break;}
}
for(int i=0;i<m;i++){
if(mv[n][i]=='B'){mp['B']++;break;}
}
for(int i=1;i<=n;i++){
if(mv[i][0]=='B'){mp['B']++;break;}
}
for(int i=1;i<=n;i++){
if(mv[i][m-1]=='B'){mp['B']++;break;}
}
for(int i=0;i<m;i++){
if(mv[1][i]=='W'){mp['W']++;break;}
}
for(int i=0;i<m;i++){
if(mv[n][i]=='W'){mp['W']++;break;}
}
for(int i=1;i<=n;i++){
if(mv[i][0]=='W'){mp['W']++;break;}
}
for(int i=1;i<=n;i++){
if(mv[i][m-1]=='W'){mp['W']++;break;}
}
if(mp['B']==4||mp['W']==4)cout<<"YES"<<'\n';
else cout<<"NO"<<'\n';
}
C
每轮有两种取法,若最小为 1 1 1则只能取 1 1 1,且会去掉一个或多个 1 1 1;否则可取 ( 1 , m i n ( a 1 , a 2... a n ) ) (1,min(a1,a2...an)) (1,min(a1,a2...an)),且可选择是否去掉一个或多个最小数。所以我们排序去重之后,找到第一个与前一位数相差不是 1 1 1的数,记录位置,则当操作到这个位置时,谁先手谁赢。需要特判一下 1 , 2 , 3 , 4... n 1,2,3,4...n 1,2,3,4...n
void solve()
{
int n;cin>>n;
vector<int>a(n+1);
for(int i=1;i<=n;i++)cin>>a[i];
sort(a.begin()+1,a.end());
a.erase(unique(a.begin()+1,a.end()),a.end());
//for(auto x:a)cout<<x<<' ';
if(n==1){
cout<<"Alice"<<'\n';
return;
}
int t=0;
int m=a.size()-1;
for(int i=1;i<=m;i++){
if(a[i]!=i){t=i;break;}
}
if(!t){
if(m&1)cout<<"Alice"<<'\n';
else cout<<"Bob"<<'\n';
return;
}
if(t&1)cout<<"Alice"<<'\n';
else cout<<"Bob"<<'\n';
}