Codeforces Round #648 (Div. 2)


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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值