zoukankan      html  css  js  c++  java
  • Chip Factory HDU

    题意:

    t组样例,对于每一组样例第一行输入一个n,下面在输入n个数

    你需要从这n个数里面找出来三个数(设为x,y,z),找出来(x+y)^z(同样也可以(y+z)^1)的最大值 (“^”代表异或操作,即“相同为0,不同为1”)

    题解:

    这一道题和Xor Sum HDU - 4825很相似

    因为异或运算的特性,我们最后要求最大值,那我们就对这n个数的二进制形式建一颗字典树。然后就暴力枚举是哪两个数相加,然后在字典树中把这两个数删掉。然后在处理完的字典树中查找那个能使结果尽可能大的第三个数(至于怎么查找具体看代码)

    代码:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <cstdlib>
      5 #include <algorithm>
      6 using namespace std;
      7 typedef long long ll;
      8 const int maxn=2;
      9 typedef struct Trie* TrieNode;
     10 ll v[1005];
     11 struct Trie
     12 {
     13     ll val,sum;
     14     TrieNode next[2];
     15     Trie()
     16     {
     17         val=0;
     18         sum=0;
     19         memset(next,NULL,sizeof(next));
     20     }
     21 };
     22 
     23 void inserts(TrieNode root,ll x,ll y)
     24 {
     25     TrieNode p = root;
     26     for(ll i=31;i>=0;--i)
     27     {
     28         ll temp=(x>>i)&1;
     29         if(p->next[temp]==NULL) p->next[temp]=new struct Trie();//printf("*%d*",temp);
     30         p->next[temp]->sum+=y;
     31         p=p->next[temp];
     32         //printf("%d ",p->sum);
     33         //p->sum+=y;
     34         //printf("%lld %lld %lld
    ",i,p->sum,temp);
     35     }
     36     p->val=x;
     37 }
     38 
     39 ll query(TrieNode root,ll x)
     40 {
     41     TrieNode p = root;
     42     for(ll i=31;i>=0;--i)
     43     {
     44         ll temp=((x>>i)&1)^1;
     45         if(p->next[temp]!=NULL && p->next[temp]->sum>0)
     46         {
     47             p=p->next[temp];
     48         }
     49         else
     50         {
     51             temp=(x>>i)&1;
     52             if(p->next[temp]!=NULL && p->next[temp]->sum>0)
     53                 p=p->next[temp];
     54             else //if(p->next[temp]==NULL && p->next[temp^1]==NULL)
     55             {
     56                 //printf("****");
     57                 //printf("%d
    ",p->val);
     58                 return x^p->val;
     59             }
     60             //else
     61         }
     62     }
     63     return x^p->val;
     64 }
     65 void Del(TrieNode root)
     66 {
     67     for(ll i=0 ; i<2 ; ++i)
     68     {
     69         if(root->next[i])Del(root->next[i]);
     70     }
     71     delete(root);
     72 }
     73 
     74 int main()
     75 {
     76     ll t,n;
     77     scanf("%lld",&t);
     78     while(t--)
     79     {
     80         TrieNode root = new struct Trie();
     81         scanf("%lld",&n);
     82         for(ll i=1;i<=n;++i)
     83         {
     84             scanf("%lld",&v[i]);
     85             inserts(root,v[i],1);
     86         }
     87         ll ans=0;
     88         for(ll i=1;i<=n;++i)
     89         {
     90             inserts(root,v[i],-1);
     91             for(ll j=i+1;j<=n;++j)
     92             {
     93                 inserts(root,v[j],-1);
     94                 ans=max(ans,query(root,v[i]+v[j]));
     95                 inserts(root,v[j],1);
     96             }
     97             inserts(root,v[i],1);
     98         }
     99         printf("%lld
    ",ans);
    100         Del(root);
    101     }
    102     return 0;
    103 }
  • 相关阅读:
    org.apache.poi.ss.usermodel 类操作excel数据遗漏
    小强的HTML5移动开发之路(13)——HTML5中的全局属性
    小强的HTML5移动开发之路(12)——从一个多媒体标签说起
    我们是怎样将网站加载时间减少 24% 的?
    CSS书写位置
    彻底理解浏览器缓存机制
    css的repaint和reflow
    CSS Reset浏览器样式重置
    专业Web设计师应该避免的6个关键错误
    网站服务器的选择
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/12001393.html
Copyright © 2011-2022 走看看