3 条题解
-
1lichengjun LV 10 @ 2023-5-13 10:44:34
(制作不易,麻烦好评)
我是这样想的:如果只有n个塔,大家都知道最少次数是2^n-1。那么2n个塔最少次数是不是2倍,也就是2*(2^n-1),看了看样例,猜想正确(一般要有4个例子正确才行)。
先计算2^n-1再*2未免麻烦,拆括号后可得到2^(n+1)-2,计算代码直接抄p1194的代码
using namespace std; typedef unsigned long long ll; const int N=1e5+10; const int INF=0x3f3f3f3f; int a[N],n,len=1; int main(){ cin>>n; a[1]=1; for(int i=1;i<=n+1;i++){ for(int j=1;j<=len;j++)a[j]*=2; for(int j=1;j<=len;j++){ a[j+1]+=a[j]/10; a[j]%=10; } if(a[len+1]>0)len++; } a[1]-=2;//一般要判断是否要借位,但2^(n+1)(n>=1)试一下会发现个位必然大于等于2 for(int i=len;i>=1;i--)cout<<a[i]; return 0; }
-
02024-1-30 11:17:33@
-
02022-1-9 15:45:16@
#include<iostream> #include<cstring> using namespace std; int main() { int a[1000]; int n; while(cin>>n) { memset(a,0,sizeof(a)); a[0]=2; if(n==1) { cout<<2<<endl; continue; } int len=1; n--; while(n--) { int x=0; for(int i=0;i<len;i++) { a[i]=a[i]*2+x; if(i==0) a[i]+=2; x=a[i]/10; a[i]%=10; } a[len]+=x; if(a[len]) len++; } for(int i=len-1;i>=0;i--) cout<<a[i]; cout<<endl; } return 0; }
- 1
信息
- ID
- 694
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 46
- 已通过
- 25
- 上传者