牛牛吃米粒
题目链接:nowcoder 225271
到主站看:https://blog.csdn.net/weixin_43346722/article/details/120505244
题目大意
给你一些数,从 ,但中间缺失了一些数,缺失的会告诉你是哪些。
问你是否能凑出数 s。
思路
你考虑都是 ,不难想到二进制。
那这些二进制是不会进位的,因为每个的个数都是 。
那我们就看每个缺失的是否恰好是 二进制上要的。
还有一种不行的情况就是 的位数大于
,那后面大于的那些位就凑不了了。
代码
#include<map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll unsigned long long
using namespace std;
ll n, k, s;
ll a[101];
int main() {
scanf("%lld %lld %lld", &n, &k, &s);
if (n != 64 && s > (1ll << n) - 1) {//处理这些数就算都有也构不成的情况(需要的位数更大)
printf("NO");
return 0;
}
for (int i = 1; i <= k; i++) {
scanf("%lld", &a[i]);
if ((s >> (a[i] - 1ll)) & 1) {//这个缺的恰好要用来拼
printf("NO");
return 0;
}
}
printf("YES");
return 0;
} 
京公网安备 11010502036488号