Codeforces Round #622 (Div. 2)—C—Skyscrapers (easy||hard version)

题目链接: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]<<" ";
}
发布了209 篇原创文章 · 获赞 40 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43872728/article/details/104476490
今日推荐