首页 > 其他 > 详细

P3147 262144

时间:2019-07-16 14:53:19      阅读:73      评论:0      收藏:0      [点我收藏+]

题面:https://www.luogu.org/problemnew/show/P3147

本题设f[i][j]表示左端点为j,能合并出i这个数字的右端点的位置
由于位置为j的数和位置为f[i-1][j]的数可以合成一个i-1
那么位置为f[i-1][j]的数和位置为f[i-1][f[i-1][j]]的数也可以合成一个i-1
那么这样就可以合成一个i了
所以就有了f[i][j]=f[i?1][f[i?1][j]]

Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<ctime>
using namespace std;
const int N=270000,M=65;
long long n,a,i,j,f[M][N],ans;
int main(){
    cin>>n;
    for(i=1;i<=n;i++){
        cin>>a;
        f[a][i]=i+1;
    }
    for(i=2;i<=60;i++){
        for(j=1;j<=n;++j){
            if(!f[i][j]){
                f[i][j]=f[i-1][f[i-1][j]];
            }
            if(f[i][j]){
                ans=i;
            }
        }
    }
    cout<<ans<<endl;
    //system("pause");
    exit(0);
}

P3147 262144

原文:https://www.cnblogs.com/ukcxrtjr/p/11194526.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!