链接:戳这里
Aaronson
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
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
思路:
直接将n去填(1<<i)就可以了 ,还有就是m不能超过32
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include <ctime>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<iomanip>
#include<cmath>
#define mst(ss,b) memset((ss),(b),sizeof(ss))
#define maxn 0x3f3f3f3f
#define MAX 1000100
///#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
typedef unsigned long long ull;
#define INF (1ll<<60)-1
using namespace std;
int a[33];
int n,m;
int main(){
for(int i=0;i<=30;i++) a[i]=(1<<i);
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
int x=lower_bound(a,a+30,n)-a;
int ans=0;
for(int i=min(m,x);i>=0;i--){
ans=ans+n/a[i];
n%=a[i];
if(n==0) break;
}
printf("%d\n",ans);
}
return 0;
}