hdu 5747 Aaronson(贪心)

来源:互联网 发布:mac os 软件开发教程 编辑:程序博客网 时间:2024/05/18 01:21

Aaronson

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 173    Accepted Submission(s): 106


Problem Description
Recently, Peter saw the equation x0+2x1+4x2+...+2mxm=n. He wants to find a solution (x0,x1,x2,...,xm) in such a manner that i=0mxi is minimum and every xi (0im) is non-negative.
 

Input
There are multiple test cases. The first line of input contains an integer T (1T105), indicating the number of test cases. For each test case:

The first contains two integers n and m (0n,m109).
 

Output
For each test case, output the minimum value of i=0mxi.
 

Sample Input
101 23 25 210 210 310 413 520 411 1112 3
 

Sample Output
1223223232
题意:

x0+2x1+4x2+...+2mxm=n  给m和m。求最小的x序列之和

思路:10的9次方最多是2的30次方,我们贪心的每次从最高位取到不能取,最后的和一定是最小的

因为是二进制所以一定可以拼出n

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;long long pow_mod(long long a,long long n){    long long ans=1;    while(n)    {        if(n&1) ans*=a;        a*=a;        n>>=1;    }    return ans;}int main(){    int T;    long long n,m;    scanf("%d",&T);    while(T--)    {        scanf("%lld %lld",&n,&m);        long long ans=0;        if(m>30) m=30;        while(n)        {            long long t=n/pow_mod(2,m);            ans+=t;            n-=t*pow_mod(2,m);            m--;        }        printf("%d\n",ans);    }    return 0;}




0 0
原创粉丝点击