首先格子编号 从 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; }