zoukankan      html  css  js  c++  java
  • [bzoj2460] [BeiJing2011]元素(线性基+贪心)

    题目大意: 有一些矿石,每个矿石有一个a和一个b值,要求选出一些矿石,b的和最大且不存在某个矿石子集它们的a的异或和为0.

    解题关键:对魔力进行由大到小排序,依次加入线性基,统计即可。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<iostream>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int MAX_BASE=63;
    ll base[64],n,m;
    struct node{
        ll x,y;
        bool operator<(const node &a)const{
            return y>a.y;
        }
    }a[10006];
    ll ans=0;
    //构造线性基,也可用来判断x是否存在,最后返回是否等于0即可。
    void getbase(){
      memset(base,0,sizeof base);
      for(int i=1;i<=n;i++){
          for(int j=MAX_BASE;j>=0;j--){
              if(a[i].x>>j){
                  if(!base[j]){
                    base[j]=a[i].x;
                    ans+=a[i].y;
                    break;
                  }
                  a[i].x^=base[j];
              }
          }
      }
    }
    
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i].x>>a[i].y;
        sort(a+1,a+n+1);
        getbase();
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    距离计算
    推荐系统
    jvm内存配置参数
    Vim 文件配置
    [转]linux shell 多线程实现
    synchronized 和 ReentrantLock 区别
    sptring boot 修改默认Banner
    Java容器类总结
    JAVA基本类型和包装类
    Linux 虚拟内存机制
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/10358591.html
Copyright © 2011-2022 走看看