专业从事成都网站建设,做营销型网站 公司,网站建设与管理期末总结,微信服务号怎么做商城正题 大意
有n把剑#xff0c;每一把剑有一个值aiai#xff0c;然后两把剑的契合值是ai and ajaiandaj#xff0c;求最大契合值。 解题思路
先把每个a转换成二进制 我们可以先从高位到低位。如果一个位数有超过一把剑那么这两个剑合在一起的值一定比任何这个位位为0的合在…正题 大意
有n把剑每一把剑有一个值aiaia_i然后两把剑的契合值是ai and ajaiandaja_i\ and \ a_j求最大契合值。 解题思路
先把每个a转换成二进制 我们可以先从高位到低位。如果一个位数有超过一把剑那么这两个剑合在一起的值一定比任何这个位位为0的合在一起要大所以我们就可以将这个位数为0的删去。但是如果这个位数有值的只有一把剑也没有用因为没有任何一把武器可以和这个武器匹配所以可以不用对这个位数进行处理。如果这个位数没有剑有值就更不用说了。 代码
#includecstdio
#includealgorithm
using namespace std;
int a[1000001],n,maxs,k,ans;
bool v[1000001];
int main()
{freopen(sword.in,r,stdin);freopen(sword.out,w,stdout);scanf(%d,n);kn;for (int i1;in;i)scanf(%d,a[i]);for (int i30;i0;i--)//枚举位数{int w1i,flag0;for (int i1;in;i)if (a[i]w!v[i])//统计这个位数有值的个数flag;if (flag2)//超过两个for (int i1;in;i)if (!v[i]!(a[i]w))//删去这个位数位值的{v[i]true;//标记删除k--;//剩余的减值}if (k2) break;//只剩两个的话直接匹配}for (int i1;in;i)//枚举匹配if (!v[i]){if (!ans) ansa[i];else ansansa[i];}printf(%d,ans);//输出
}