题意:有一块2^n大的金块,你每一次只能把一块变成相同的两快(当然大小是原来的1/2),问你现在有容量a,b,a+b = 2^n的背包,多少次能够使得a,b把这所有的金块都装下去。
解题思路:递归。
解题代码:
1 // File Name: f.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月15日 星期日 12时19分58秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 LL a, b ; 28 LL p(int n) 29 { 30 LL sum = 1; 31 for(int i= 1;i <= n;i ++) 32 sum *=2 ; 33 return sum; 34 } 35 int solve(LL t, LL now) 36 { 37 //printf("%lld %lld\n",t,now); 38 if(t == now) 39 return 0; 40 return 1 + solve(t/2,abs(now-t/2)); 41 } 42 int main(){ 43 int t ; 44 scanf("%d",&t); 45 while(t--) 46 { 47 int n ; 48 scanf("%d %lld %lld",&n,&a,&b); 49 printf("%d\n",solve(p(n),a)-1); 50 } 51 return 0; 52 }
时间: 2024-10-14 08:05:17