题目链接:C—Skyscrapers
C1 - Skyscrapers (easy version)
满足题目中要求的序列一定是一个单峰序列(包括单调),只有单峰序列才满足不存在两边大中间小的情况;所以每个点都可以构成单峰序列,只不过构成的序列值总和不一样而已,暴力枚举n个点,然后取构成单峰序列总和最大的那个点即可;数据范围1≤n≤1000,所以O(N^2)复杂度能过;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100005];
int main()
{
int n;
cin >>n;
for(int i=1;i<=n;i++) cin >>a[i];
ll maxx=-0x3f3f3f3f,res,ans=-1;
for(int i=1;i<=n;i++)
{
ll sum=a[i],res=a[i];
for(int j=i-1;j>=1;j--)
{
if(a[j]<res)
{
sum+=a[j];
res=a[j];
}
else sum+=res;
}
res=a[i];
for(int j=i+1;j<=n;j++)
{
if(a[j]<res)
{
sum+=a[j];
res=a[j];
}
else sum+=res;
}
if(sum>maxx)
{
ans=i;
maxx=sum;
}
}
res=a[ans];
for(int i=ans-1;i>=0;i--)
{
if(a[i]<res) res=a[i];
else a[i]=res;
}
res=a[ans];
for(int i=ans+1;i<=n;i++)
{
if(a[i]<res) res=a[i];
else a[i]=res;
}
for(int i=1;i<=n;i++) cout <<a[i]<<" ";
}