A. Matrix Game
题意:
给定n*m的01矩阵
现在有A和B两个人博弈
每次可以选择一个格子,满足这个格子所在的行和列都是0,然后把这个格子变成1
最先不能操作的玩家失败,现在A先手,问最优策略下谁获胜。
数据范围:n,m<=50
解法:
想复杂了,其实根本没有最优策略,这个博弈是没有操作空间的。
每次操作一定都会将可选行数量减1,可选列数量减1
统计初始矩阵中可选行和可选列的数量
判断他们最小值的奇偶性就行了
code:
#include<bits/stdc++.h>
using namespace std;
const int N=55;
int a[N][N];
int r[N],c[N];
signed main(){
int T;cin>>T;
while(T--){
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++){
r[i]=0;
}
for(int j=1;j<=m;j++){
c[j]=0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]){
r[i]=1,c[j]=1;
}
}
}
int tr=0,tc=0;
for(int i=1;i<=n;i++){
if(!r[i])tr++;
}
for(int j=1;j<=m;j++){
if(!c[j])tc++;
}
int cnt=min(tr,tc);
if(cnt%2==0){
puts("Vivek");
}else{
puts("Ashish");
}
}
return 0;
}
E. Maximum Subsequence Value
题意:
给定长度为n的序列
你要选出一个子序列,假设子序列的大小为k
将数组中的每个数转化为二进制,
如果有至少max(1,k-2)个数的二进制第i位为1,那么当前子序列的价值累加2i
问选出的子序列的最大价值是多少
数据范围:n<=500
解法:
原题面把我人都搞傻了,看了别人的中文题意才发现自己题意理解错了,白给了。
当k<=3的时候,max(1,k-2)=1,也就是有一个数二进制位为1就有贡献,
这时候k<=3个数的价值其实就是这k个数或起来
当k=4的时候,max(1,k-2)变成2,当k=5的时候,max(1,k-2)=3,后面都是递增的
因为需要至少有k-2个第i位为1,根据抽屉原理可以推出:任选3个数必定至少有一个在第i位为1
所以只对k=3的情况计算max就行了,直接暴力三重循环枚举三个数求他们二进制或的max即可。
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=505;
int a[N];
signed main(){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
ans=max(ans,a[i]|a[j]|a[k]);
}
}
}
cout<<ans<<endl;
return 0;
}