其他分享
首页 > 其他分享> > Codeforces Round #809 (Div. 2) C. Qpwoeirut And The City(枚举 / dp)

Codeforces Round #809 (Div. 2) C. Qpwoeirut And The City(枚举 / dp)

作者:互联网

https://codeforces.com/contest/1706

一排n栋建筑,其中第I(1≤I≤n)栋楼高hi层。当且仅当建筑物I中的层数hi大于建筑物j中的层数hj时,建筑物I才比建筑物j高

如果建筑I高于建筑I-1和建筑i+1(并且两者都存在),则建筑I是凉爽的。注意1号楼和n号楼都不能凉。

为了改造这个城市,Qpwoeirut需要最大化酷建筑的数量。为此,Qpwoeirut可以在任何建筑的顶部建造额外的楼层,使它们更高。请注意,他不能删除已经存在的楼层。

由于建造新的楼层很昂贵,Qpwoeirut希望尽量减少他建造的楼层数量。找出Qpwoeirut需要建造的最少楼层数,以便最大化酷建筑的数量。
input
6
3
2 1 2
5
1 2 1 4 3
6
3 1 4 5 5 2
8
4 2 1 3 5 3 6 1
6
1 10 1 1 10 1
8
1 10 11 1 10 11 10 1
output
2
0
3
3
0
4
  1. 第一种模拟做法
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=500500;
const int M=2002;
LL a[N],b[N];
int f[N][2][2];
LL dp[N][3];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        for(LL i=1;i<=n;i++)
            cin>>a[i];
        LL sum=0;
        for(LL i=2;i<=n-1;i++)
        {
            b[i]=max((LL)0,max(a[i-1],a[i+1])+1-a[i]);
            if(i%2==0) sum+=b[i];
            //cout<<b[i]<<" ";
        }
        if(n%2==1) cout<<sum<<endl;
        else
        {
            LL minn=sum;
            LL res=sum;
            for(LL i=n-1;i>=2;i-=2)
            {
                res-=b[i-1];
                res+=b[i];
                minn=min(res,minn);
            }
            cout<<minn<<endl;
        }
    }
    return 0;
}

dp做法稍后再补

标签:City,建筑,10,int,LL,Codeforces,凸包,Round,Qpwoeirut
来源: https://www.cnblogs.com/Vivian-0918/p/16546563.html