51nod 1315
2016-09-13 21:12
183 查看
这题思维方面要求还是有的、
先把数划分为两种,一种是可能删去的,一种是不可能删去的, 不可能的数有两种
第一种:如果一个数a|x>x那么a肯定不可能删去,因为含有它的子集根本|不到k,
第二种:要|操作得到k,那么把k化为二进制比如 1011, 如果一个数是111,那个这个111就肯定是不可能删去的,它|之后会让第三位为1,也就不可能达到k、
那么把剩下的数也就是说将他们化为二进制,处理他们为1的部分++, 因为每一个数对应的每一位最多只有一个1, 那么再找一个最小数的个数行了、
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int qq = 55;
ll num[qq];
int vis[qq];
int flag[qq];
int main(){
int p=0;
ll n,k;scanf("%lld%lld",&n,&k);
int x;
for(int i=0; i<n; ++i){
scanf("%d",&x);
if((x|k)>k) continue; //首先处理掉第一种不可能删去的数、
num[p++] = x;
}
x=0;
while(k){
flag[x++]=k%2;
k/=2;
}
int w[50];
for(int i=0; i<p; ++i){
int y=0;
while(num[i]){
w[y++]=num[i]%2;
num[i]/=2;
}
int j;
for(j=0; j<y; ++j) //处理掉第二种不可能删除的数、
if(w[j]==1&&flag[j]==0) break;
if(j<y) continue;
for(j=0; j<y; ++j) //最后统计每一位上有1的数的个数、
if(w[j]==1) vis[j]++;
}
int maxn=1e9;
for(int i=0; i<x; ++i) //要删去最少的1,那么挑k中为1的位置中最小的一个统计数
if(flag[i]==1) maxn=min(maxn, vis[i]);
printf("%d\n", maxn);
return 0;
}
先把数划分为两种,一种是可能删去的,一种是不可能删去的, 不可能的数有两种
第一种:如果一个数a|x>x那么a肯定不可能删去,因为含有它的子集根本|不到k,
第二种:要|操作得到k,那么把k化为二进制比如 1011, 如果一个数是111,那个这个111就肯定是不可能删去的,它|之后会让第三位为1,也就不可能达到k、
那么把剩下的数也就是说将他们化为二进制,处理他们为1的部分++, 因为每一个数对应的每一位最多只有一个1, 那么再找一个最小数的个数行了、
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int qq = 55;
ll num[qq];
int vis[qq];
int flag[qq];
int main(){
int p=0;
ll n,k;scanf("%lld%lld",&n,&k);
int x;
for(int i=0; i<n; ++i){
scanf("%d",&x);
if((x|k)>k) continue; //首先处理掉第一种不可能删去的数、
num[p++] = x;
}
x=0;
while(k){
flag[x++]=k%2;
k/=2;
}
int w[50];
for(int i=0; i<p; ++i){
int y=0;
while(num[i]){
w[y++]=num[i]%2;
num[i]/=2;
}
int j;
for(j=0; j<y; ++j) //处理掉第二种不可能删除的数、
if(w[j]==1&&flag[j]==0) break;
if(j<y) continue;
for(j=0; j<y; ++j) //最后统计每一位上有1的数的个数、
if(w[j]==1) vis[j]++;
}
int maxn=1e9;
for(int i=0; i<x; ++i) //要删去最少的1,那么挑k中为1的位置中最小的一个统计数
if(flag[i]==1) maxn=min(maxn, vis[i]);
printf("%d\n", maxn);
return 0;
}
相关文章推荐
- 什么事ORM框架
- FileReader:读取图片文件并显示
- 打印俄文
- HDU 4463 Outlets
- Android21--Android之Android中的Fragment
- -webkit-line-clamp 多行文字溢出...
- Carthage
- 一个获取号码归属地和其他信息(诈骗、骚扰等)的开源库
- Vijos P1412 多人背包
- SqlServer索引的原理与应用
- 在 keil MDK_V5中加入arm7,arm9等一些芯片型号
- machine people
- 四人小组项目
- EasyUI——常见用法总结
- 动画的简单使用
- [LeetCode] Find the Difference
- 【seen看世界】:人们为什么会趋于稳定?
- 滑动滚轮放大缩小
- android-7.0.0_r1
- HTML学习记录之超链接和路径