方法一:因为最多是10的六次方,所以可以直接枚举二进制上的每一位来得到最优结果。

AC代码:

#include<iostream>
#include<stack>
#include<stdio.h>
#include<queue>
#include<map>
#include<algorithm>
#include<vector>
#include<string>
#include<cmath>
#include<cstring>
using namespace std;
# define inf 0x3f3f3f3f
# define maxn 1000000+100
# define ll long long
int a[maxn];
int tempsave[maxn];
int vis[maxn];
int maxx;
vector<int>ans[20];
int n,m;
void cal(int t)
{
int num=0;
int e=t;
while(t)
{
int temp=t%2;
t/=2;
tempsave[++num]=temp;
}
for(int i=num; i>=1; i--)
{
if(tempsave[i]!=0)
{
maxx=max(i-1,maxx);
ans[i-1].push_back(e);//把和这一位有关的放进这一位上的容器里
}
}
}
ll Pow(ll t1,ll t2)
{
t2--;
ll temp=t1;
for(int i=1; i<=t2; i++)
{
temp*=t1;
}
return temp;
}
bool judge(int t)
{
int len=ans[t].size();
for(int i=0; i<len; i++)
{
int temp=ans[t][i];
if(vis[temp]==1)//如果这一位上已经有数了,返回就可以了。
{
return true;
}
}
for(int i=0; i<len; i++)
{
int temp=ans[t][i];
if(vis[temp]==0)//如果这一位上之前没有数,并且找到了,然后就直接用就可以了。因为二进制的话,越靠前肯定是越大的。
{
m--;
vis[temp]=1;
return true;
}
}
return false;//如果都没有找到,返回false
}
int main()
{
// freopen("looking.in","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
maxx=0;
for(int i=0; i<50; i++)ans[i].clear();
memset(vis,0,sizeof(vis));
scanf("%d %d",&n,&m);
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
cal(a[i]);
}
ll sum=0;
int t=0;
for(int i=maxx; i>=0; i--)
{
if(m==0)break;
if(judge(i))
{
if(i==0)sum+=1;
else
sum+=Pow(2,i);
}
}
printf("%d\n",sum);
}
return 0;
}

方法二:看数据,直接把所有的数“|”就完事了,因为给的数是大于20的。。。。、

AC代码:

#include<iostream>
#include<stack>
#include<stdio.h>
#include<queue>
#include<map>
#include<algorithm>
#include<vector>
#include<string>
#include<cmath>
#include<cstring>
using namespace std;
# define inf 0x3f3f3f3f
# define maxn 100000+100
# define ll long long
ll a[maxn];
int main()
{
// freopen("looking.in","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
}
ll sum=0;
for(int i=1; i<=n; i++)
{
sum=sum|a[i];
}
printf("%d\n",sum);
}
return 0;
}

L - Looking for Taste Gym - 101991L 二进制枚举/思维的更多相关文章

  1. HDU - 6435 Problem J. CSGO 2018 Multi-University Training Contest 10 (二进制枚举+思维)

    题意:有N个主武器(MW)和M个副武器(SW),每个武器都有自己的S值,和K个附加属性xi.要选取一对主副武器搭配,搭配后获得的性能由该公式得出: 求获得最大的性能为多少. 分析:由于|xm - xs ...

  2. Gym - 100712G Heavy Coins(二进制枚举)

    https://vjudge.net/problem/Gym-100712G 题意:给出n枚不同价值的硬币和一个总价S,现在要选择尽量多的硬币来大于等于S,要求是比如说现在选择的硬币的总和为sum,那 ...

  3. Consonant Fencity Gym - 101612C 暴力二进制枚举 Intelligence in Perpendicularia Gym - 101612I 思维

    题意1: 给你一个由小写字母构成的字符串s,你可以其中某些字符变成大写字母.如果s中有字母a,你如果想把a变成大写,那s字符串中的每一个a都要变成A 最后你需要要出来所有的字符对,s[i]和s[i-1 ...

  4. UVA1354-Mobile Computing(二进制枚举子集)

    Problem UVA1354-Mobile Computing Accept:267  Submit:2232 Time Limit: 3000 mSec  Problem Description ...

  5. HPU组队赛B:问题(二进制枚举)

    时间限制1 Second 内存限制 512 Mb 题目描述 你有n个问题,你已经估计了第i个问题的难度为Ci,现在你想使用这些问题去构造一个问题集.比赛的问题集必须包含至少两个问题,而且比赛的总难度必 ...

  6. 牛客网 牛客练习赛43 F.Tachibana Kanade Loves Game-容斥(二进制枚举)+读入挂

    链接:https://ac.nowcoder.com/acm/contest/548/F来源:牛客网 Tachibana Kanade Loves Game 时间限制:C/C++ 1秒,其他语言2秒 ...

  7. CUGBACM_Summer_Tranning1 二进制枚举+模拟+离散化

    整体感觉:这个组队赛收获还挺多的.自从期末考试以后已经有一个多月没有 做过组队赛了吧,可是这暑假第一次组队赛就找回了曾经的感觉.还挺不错的!继续努力!! 改进的地方:这次组队赛開始的时候题目比較难读懂 ...

  8. poj1873(二进制枚举+求凸包周长)

    题目链接:https://vjudge.net/problem/POJ-1873 题意:n个点(2<=n<=15),给出n个点的坐标(x,y).价值v.做篱笆时的长度l,求选择哪些点来做篱 ...

  9. POJ 1873 The Fortified Forest 凸包 二进制枚举

    n最大15,二进制枚举不会超时.枚举不被砍掉的树,然后求凸包 #include<stdio.h> #include<math.h> #include<algorithm& ...

随机推荐

  1. virtio 之后的数据直连

    在上一篇中说了virtio这种半虚拟化方案之后,还有一种全虚拟化的方案,这种全虚拟化的方案中,直接宿主机上的设备,直接被虚拟化成了n个设备,然后这些设备可以直接被加载进guest os中当做一个普通的 ...

  2. JVM初识、调优

    JVM是按照运行时数据的存储结构来划分内存结构的,JVM在运行java时,将他们划分成几种不同格式的数据,分别存储在不同的区域,这些数据统一称为运行时数据,运行时数据包括java程序本身的数据信息和J ...

  3. 面试- 阿里-. 大数据题目- 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?

    假如每个url大小为10bytes,那么可以估计每个文件的大小为50G×64=320G,远远大于内存限制的4G,所以不可能将其完全加载到内存中处理,可以采用分治的思想来解决. Step1:遍历文件a, ...

  4. HDU4767_Sum Of Gcd

    通过一个题目,学到了很多. 题意为给你n个数,每次询问i,j,答案为i,j间任取两数所有的取法gcd的和. 假设我们当前要看看这个区间有多少个数的gcd为x,最最原始的想法都是查询这个区间有多少个数为 ...

  5. BZOJ 2467 生成树(组合数学)

    题意:求n-五边形的生成树个数. 结论题,答案为4*n*5^(n-1). 首先中心的n边形一定需要切掉一个边,C(1,n). 然后每个五边形都切一个边,C(1,4)*5^(n-1). 于是答案就是4* ...

  6. BZOJ 2006 超级钢琴(堆+主席树)

    很好的一道题. 题意:给出长度为n的数列,选择k个互不相同的区间,满足每个区间长度在[L,R]内,求所有选择的区间和的总和最大是多少.(n,k<=5e5). 首先将区间和转化为前缀和之差,那么我 ...

  7. 【bzoj3796】Mushroom追妹纸 Kmp+二分+Hash

    题目描述 给出字符串s1.s2.s3,找出一个字符串w,满足: 1.w是s1的子串: 2.w是s2的子串: 3.s3不是w的子串. 4.w的长度应尽可能大 求w的最大长度. 输入 输入有三行,第一行为 ...

  8. 【JavaScript&jQuery】省市区三级联动

    HTML: <%@page import="com.mysql.jdbc.Connection"%> <%@ page language="java&q ...

  9. OSPF与Vlan间通信综合实验小结与端口隔离

      总结 本实验模拟实际工作环境的网络拓扑结构,至此终于理解了一部分的配置思路: 一.三层交换机连接路由器的端口配置 图中GE0/0/4应该是配置成access类型,这个时候应该是不带vlan标签的. ...

  10. 【交换机在江湖】第十三章 VLAN划分篇

    江湖各位大侠重温了VLAN的基础知识,是否想过4094个VLAN可以怎样划分,哪种方式又是好用简单的?细心的小编特地整理了一番,给各位大侠把玩把玩. VLAN划分的方式: Ø 基于接口划分VLAN:  ...