Codeforces #250 (Div. 2) B. The Child and Set

版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/u011639256/article/details/28100041

题读错了啊。。。

一直跪,但刚開始我的思路是正确的

假设做出来了rating一定会暴涨的抓狂

我的方法是找出1到100000全部数相应的lowbit()值

再暴力,可惜题读错了,lowbit的意思是找出该数二进制数从右向左1出现的最早位置相应的数值

代码例如以下:

#include <cmath>
#include <stack>
#include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXN 100010
#define ll long long
using namespace std;

int a[] = {1, 2, 4, 8, 16, 32, 64, 128,
            256, 512, 1024, 2048, 4096, 8192,
            16384, 32768, 65536, 131072};
int b[MAXN];
int c[MAXN];
ll sum[MAXN];

void f(void) {
    sum[0] = 0;
    for(int i=1; i<MAXN; ++i) {
        for(int j=0; j<18; ++j) {
            if(i & a[j]) {
                b[i] = a[j];
                break;
            }
        }
        sum[i] = sum[i-1]+b[i];
    }
    return ;
}

int main(void) {
    ll s, k;
    int tmp;
    f();
    while(cin >> s >> k) {
        int cnt = 0;
        if(s > sum[k]) {
            printf("-1
");
            continue;
        }

        for(int i=k; i>0; --i) {
            if(s-b[i] > 0) {
                s -= b[i];
                c[cnt++] = i;
            }
            else if(s-b[i] == 0) {
                c[cnt++] = i;
                break;
            }
        }
        
        printf("%d
", cnt);
        printf("%d", c[0]);
        for(int i=1; i<cnt; ++i)
            printf(" %d", c[i]);
        cout << endl;
    }
    return 0;
}


【推广】 免费学中医,健康全家人
原文地址:https://www.cnblogs.com/ldxsuanfa/p/10878010.html