Code Forces 587 A. Duff and Weight Lifting(贪心)

来源:互联网 发布:淘宝网藏族服装 编辑:程序博客网 时间:2024/06/13 22:59

Description
达夫每天练习举重,教练给了她n个重量值为2^wi哑铃让她举,每次达夫可以举起满足2^a1+2^a2+…+2^ak=2^x的重量并将这些哑铃扔掉,问达夫最少几次完成教练的任务
Input
第一行为一整数n表示哑铃数,第二行n个整数wi表示第i个哑铃重2^wi
Output
输出达夫最少几次能完成任务
Sample Input
5
1 1 2 3 3
Sample Output
2
Solution
贪心,贪心策略是每次尽可能找到重量之和能够组成2^x的重量,显然如果a1,a2,…,ak互不相同是不可能满足条件的,同时由一个显然的结论2^n+2^n=2^(n+1)我们可以先将哑铃“合并”,那么最后还剩的重量就是每一次要举的重量,注意此处数组要开大一点,因为当有10^6个重量为2^(10^6)的哑铃时会合并出10^6+log(10^6)的x值,具体过程见代码
Code

#include<stdio.h>#include<string.h>#define maxn 1111111int n,w,num[maxn],ans;int main(){    while(~scanf("%d",&n))    {        memset(num,0,sizeof(num));        ans=0;        for(int i=0;i<n;i++)        {            scanf("%d",&w);            num[w]++;        }        for(int i=1;i<maxn;i++)//合并             num[i]+=(num[i-1]/2),num[i-1]%=2;        for(int i=0;i<maxn;i++)//剩下的就是每次需要举的重量             ans+=num[i];        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击