线性基的简单贪心证明&新NIM游戏题解

异或线性基是一个集合可以通过异或表示原集合的所有数.线性基的贪心证明正确性(简要),假定1,4,5.
我们可以选择插入1,4|1,5,显然插入4,5更优.
简单的更下这个题题解.
我们知道原nim游戏,假如堆数异或和为0且你现在动,那么你必输.我如何才能使得到这个东西呢?换句话来说,我们制造一个别人通过取或不取一堆得都不能使异或和为0则可以,那么我们只需维护一个最大的线性基即可.
从大到小排序,然后套个线性基就好了.
至于nim游戏?这就不用讲了吧..以后会做博弈论+dp专题的.maybe退役?
代码如下:

#include <bits/stdc++.h>
using namespace std;
long long a[105];
long long b[105];
bool cmp(int a,int b)
{
    return a>b;
}

int main()
{
    int n;
    long long sum=0;
    cin>>n;
    for(int i=1;i<=n;i++)   {cin>>a[i];sum+=a[i];}
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++)   b[i]=a[i];
    long long ans=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]==0) continue;
        ans+=b[i];
        for(int j=30;j>=0;j--)
        {
            if(a[i]>>j&1)
            {
                for(int k=1;k<=n;k++)
                {
                    if((a[k]>>j&1)&&i!=k)
                    {
                        a[k]^=a[i];
                    }
                }
                break;
            }
        }
    }
    cout<<sum-ans<<endl;
    return 0;
}
lpt的小屋 文章被收录于专栏

我想要一份甜甜的爱情

全部评论

相关推荐

码砖:求职岗位要突出,一眼就能看到,教育背景放到最后,学校经历没那么重要,项目要重点突出
点赞 评论 收藏
分享
昨天 13:43
门头沟学院 Java
longerluck...:我猜说的是“你真**是个天才”
投递美团等公司10个岗位
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务