2 条题解

  • 5
    @ 2026-1-12 22:08:42
    #include<bits/stdc++.h>
    using namespace std;
    int dp[61][300005];
    int main()
    {
    	int n;
    	cin>>n;
    	int i,j;
    	for(i=1;i<=n;i++)
    	{
    		int x;
    		cin>>x;
    		dp[x][i]=i+1;
    	}
    	int ans=0; 
    	for(i=2;i<=58;i++)
    	{
    		for(j=1;j<=n;j++)
    		{
    			if(!dp[i][j])
    			{
    				dp[i][j]=dp[i-1][dp[i-1][j]];
    			}
    			if(dp[i][j]) ans=i;
    		}
    	}
    	cout<<ans;
    	return 0;
    }
    
    
    
    
  • 4
    @ 2026-1-18 9:45:42
    #include<bits/stdc++.h>
    using namespace std;
    int f[1000][1000],t,n,ans;
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++) {
    		cin>>t;
    		//值为t的数字在位置i,合并后跳到i+1位置(表示i和i+1可合并为t+1) 
    		f[t][i]=i+1;
    	}
    	//i表示当前要计算的目标值(从2开始,因为初始值最小为1,合并后至少为2)
    	for(int i=2;i<=40;i++){
    		for(int j=1;j<=n;j++){
    			if(f[i][j]==0){
    				f[i][j]=f[i-1][f[i-1][j]];//表示 值i-1在j的合并位置 再做一次i-1的合并
    			}
    			if(f[i][j]!=0){//更新 
    				ans=i;
    			}
    		}
    	}
    	cout<<ans;
    	return 0;
    }
    
    • 1

    信息

    ID
    2860
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    (无)
    递交数
    215
    已通过
    129
    上传者