Aaronson
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 616 Accepted Submission(s): 354
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 (0≤i≤m) is non-negative.
Input
There are multiple test cases. The first line of input contains an integer T (1≤T≤105), indicating the number of test cases. For each test case:
The first contains two integers n and m (0≤n,m≤109).
Output
For each test case, output the minimum value of ∑i=0mxi.
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
Source
BestCoder Round #84
题目应该看得懂首先这里的xi都是非负整数。以10 2为例结果是3,所以就有2^0(1)x0+2^1(2)x1+2^2(4)x2=10,要想让x0+x1+x2就要从右往左便利,依次挑选合适的条件,这里就是挑选了2个4,1个2,0个1,具体代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m,ans=0,i,a[1001],t1;
scanf("%d%d",&n,&m);
t1=m;//t1赋值为m,如果没有a[i]>=n就直接从m开始遍历
for(i=0; i<=m; i++)
{
a[i]=pow(2,i);
if(a[i]>=n)
{
t1=i;
break;
}
}
for(i=t1; i>=0; i--)
{
if(n>=a[i])
{
ans+=n/a[i];//挑选几个最大的
n=n%a[i];//挑选后剩余的
}
}
printf("%d\n",ans);
}
}