首先格子编号 从 1 ~ n 分别对应二进制位从低位到高位对应的值。对于第i个格子就是2^(i-1),所以对于s如果二进制某一位是 1 则说明要取这个格子的米粒,如果为0说明不取.
所以你这题只要判断下S二进制位中为1对应的格子 是否存在 且 非空,如果出现了一个格子是空的,或者没有这个格子,那么就是"NO"无法构造出这个方案,否则输出"YES"表示可以构成这个方案.
注意cin >> 要开usigned long long 不然就会有样例过不了(不知道为啥),scanf的话用long long 是可以的
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int v[90];
int main(){
//init();
unsigned long long n,k,s; cin >> n >> k >> s;
for(int i = 1; i <= k; ++i){int x; cin >> x; v[x] = 1;}
int t = 0;//t + 1为第几个格子
bool f = 1;
while(s){
if(s&1){
if(v[t + 1]){f = 0 ;break;}
}
s >>= 1;
++t;
}
if(f && t <= n) cout << "YES";
else cout << "NO";
return 0;
}

京公网安备 11010502036488号