题解 | #A#
牛牛吃米粒
https://ac.nowcoder.com/acm/contest/11179/a
A.牛牛吃米粒
把每个格子看成一个二进制位,n个格子就构成一个二进制数。而每个二进制数唯一对应一个十进制数。因此n个格子能构成s对应的二进制数时答案为"YES",否则为"NO。
经过两步判断可求得答案:
- s否超出2^n,则一定为"NO"
- s对应的二进制为上1的位置若出问题,则一定为"NO"
首先进行第一步判断s的最大值为2^64,位运算时有些细节:
- 当n=64时,数据范围内的所有s都能被表示。
- 当n<64时,需要用位运算判断s是否超过2^n。
#include <iostream>
#include <cstring>
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 70;
int n, k, a[N];
ULL s;
int main() {
cin >> n >> k >> s;
bool flag = 1;
ULL tem = 1;
if (n <= 63 && (tem << n) <= s)//判断s是否超过n位二进制的最大表示范围
flag = 0;
for (int i = 1; i <= k; i ++) {
int x;
cin >> x;
if (s >> (x - 1) & 1) flag = 0;//判断第x(从1开始)位二进制是否为1
}
if (flag) cout << "YES";
else cout << "NO";
return 0;
}