codeforces --- Round #250 (Div. 2) B. The Child and Set

<传送门>

【题目大意】

给你一个sum和一个limit,现在要你在1~limit中找到一些数来使得这些数的和等于sum,如果能找到的话就输出找到的数的个数和这些数,未找到输出"-1"。

比赛的时候被hack了。

【题目分析】

这题需要将所有的数的lowbit先求出来,然后按照大小排序,然后从后往前判断,如果这个数小于sum那么这个数就是可以构成sum的数,选进去,完了以后判断sum的值是否为0就可以了。做题的时候没将题目理解透彻。

codeforces --- Round #250 (Div. 2) B. The Child and Set
#include<bits/stdc++.h>

#define MAX 100010

using namespace std;

struct Node

{

    int num;

    int id;

    bool vis=0;

};

Node node[MAX];

int sum,limit;

int lowbit(int x)

{

    return x&(-x);

}

bool cmp(Node a,Node b)

{

    return a.num<b.num;

}

int main()

{

    scanf("%d%d",&sum,&limit);

    int i,j;

    for(i=1;i<=limit;i++)

    {

        node[i].num=lowbit(i);

        node[i].id=i;

    }

    sort(node+1,node+1+limit,cmp);

    int cnt=0;

    for(i=limit;i>=1;i--)

    {

        if(node[i].num<=sum)

        {

            sum-=node[i].num;

            node[i].vis=1;

            cnt++;

        }

    }



    if(sum)

        printf("-1");

    else

    {

        printf("%d\n",cnt);

        for(i=limit;i>=1;i--)

        {

            if(node[i].vis)

            {

                printf("%d ",node[i].id);

            }

        }

    }

    putchar(10);

    return 0;

}
View Code

 

你可能感兴趣的:(codeforces)