点这里进原题
B. The Child and Set
题目大意
有一个集合为 {1,2,3,…,limit}。李四想知道是否存在一个sum,使集合中部分数的lowbit(二进制表达式中最低位的1所对应的值)和等于sum。
解析
像我这种蒟蒻首先要知道的是lowbit怎么算qwq
int lowbit(int x) {
return x&(-x);
}
既然要算lowbit的和是否等于sum,就用写结构体把所有数字及其对应的lowbit值存到数组里,对他进行一个由大至小的排序,然后贪心去做就行。
AC CODE
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
using namespace std;
const int N = 1e5+10;
typedef long long LL;
struct node {
int low,nmb;
};
bool cmp(node a,node b){
return a.low > b.low;
}
int lowbit(int x) {
return x&(-x);
}
/* BOKI */
int main() {
int limit,sum; cin >> sum >> limit;
node bit[N];
int tot = 0,b[N],cnt = 0;
for(int i = 1;i <= limit;i++) {
bit[i].low = lowbit(i),bit[i].nmb = i;
}
sort(bit+1,bit+limit+1,cmp);
for(int i = 1;i <= limit;i++) {
if(tot + bit[i].low <= sum) tot += bit[i].low,b[cnt++] = bit[i].nmb;
if(tot == sum) break;
if(i == limit && tot != sum) {
cout << -1 << endl; return 0;
}
}
cout << cnt << endl;
for(int i = 0;i < cnt;i++) cout << b[i] << ' ';
cout << endl;
return 0;
}
END