标签:大盘 problem targe 问题 type bool content font iostream
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2064
Input包含多组数据,每次输入一个N值(1<=N=35)。Output对于每组数据,输出移动最小的次数。Sample Input
1 3 12
Sample Output
2 26 531440
题解:
可知,要想把第n个盘从左(1)移到3,需要想把前n-1个从左(1)移动右(3),再从右(3)移到左(1),最后再从左(1)移到右(3)。
而第n个盘要从左(1)到中(2)再右(3)经历2步。
所以,f(n)=3*f(n-1)+1;经数学计算最终可得到f(n)=3^n-1;
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <vector> 6 #include <cstdlib> 7 #include <iomanip> 8 #include <cmath> 9 #include <ctime> 10 #include <map> 11 #include <set> 12 #include <queue> 13 using namespace std; 14 #define lowbit(x) (x&(-x)) 15 #define max(x,y) (x>y?x:y) 16 #define min(x,y) (x<y?x:y) 17 #define MAX 100000000000000000 18 #define MOD 1000000007 19 #define pi acos(-1.0) 20 #define ei exp(1) 21 #define PI 3.141592653589793238462 22 #define INF 0x3f3f3f3f3f 23 #define mem(a) (memset(a,0,sizeof(a))) 24 typedef long long ll; 25 ll gcd(ll a,ll b){ 26 return b?gcd(b,a%b):a; 27 } 28 bool cmp(int x,int y) 29 { 30 return x>y; 31 } 32 const int N=10005; 33 const int mod=1e9+7; 34 int main() 35 { 36 std::ios::sync_with_stdio(false); 37 ll dp[36]={0,2}; 38 for(int i=2;i<36;i++){ 39 dp[i]=3*dp[i-1]+2; 40 } 41 int n; 42 while(cin>>n){ 43 cout<<dp[n]<<endl;//dp[n]=3^n-1; 44 } 45 return 0; 46 }
标签:大盘 problem targe 问题 type bool content font iostream
原文地址:http://www.cnblogs.com/shixinzei/p/7297721.html