HDU 5747 Aaronson(贪心)

来源:互联网 发布:微积分教材 知乎 编辑:程序博客网 时间:2024/05/17 21:57

Description
给出两个整数n和m,求方程这里写图片描述的所有非负解中这里写图片描述的最小值
Input
第一行一个整数T表示用例组数,每组用例占一行包括两个整数n和m
(1<=T<=10^5,0<=n,m<=10^7)
Output
对于每组用例,输出方程所有非负解中这里写图片描述的最小值
Sample Input
10
1 2
3 2
5 2
10 2
10 3
10 4
13 5
20 4
11 11
12 3
Sample Output
1
2
2
3
2
2
3
2
3
2
Solution
贪心,尽可能使用下标较大的x
Code

#include<cstdio>#include<iostream> using namespace std;#define maxn 111int T,n,m,a[maxn],res,num; void deal(int x){     res=num=0;     while(x)     {        a[res++]=x%2;        num+=x%2;        x/=2;     }}int main(){    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        deal(n);        if(m>=res-1)printf("%d\n",num);        else        {            deal(n%(1<<m));            printf("%d\n",(n>>m)+num);        }    }    return 0;}
0 0