3 条题解

  • 1
    @ 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;
    }
    
    • 0
      @ 2024-1-30 11:17:33
      
      
      • 0
        @ 2022-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
        上传者