[codeforces 1313C1] Skyscrapers (easy version) 问的是谷,答的是峰

本文详细解析了Codeforces Round #622 (Div.2)中C1题“Skyscrapers (easy version)”的算法思路,通过实例展示了如何将输入数组转换为满足题目条件的最大总楼层数的数组,并分享了AC代码。
摘要由CSDN通过智能技术生成

Codeforces Round #622 (Div. 2)   比赛人数5752

[codeforces 1313C1] Skyscrapers (easy version)   问的是谷,答的是峰

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.ml/contest/1313/problem/C1

ProblemLangVerdictTimeMemory
C1 - Skyscrapers (easy version) GNU C++11Accepted31 ms0 KB

比赛时,发现该题C1的AC率是B题的2-3倍,基本可以认为,以下算法是成熟算法。

在比赛时,也果断的放置B题,开始C1题的编码。

问的是谷,答的是峰

样例手动算法如下

Input1
5
1 2 3 2 1   没有谷
Output1
1 2 3 2 1   3是峰

Input2
3
10 6 8      6是谷

处理过程
10 6 6      10是峰   选和最大的输出,注意计算和,int要溢出
6 6 8       6是峰

Output2
10 6 6      10是峰


再造一组数据:在写这组数据的过程中,对
Also there mustn't be integers j and k such that j<i<k and aj>ai<ak. 
Plots j and k are not required to be adjacent to i.
有了更深刻的理解,j,i,k可以不相邻。
Input3
5 2 4 1 3   谷是2,1
处理后,合适数据如下:
5 2 2 1 1   5是峰   选和最大的输出,注意计算和,int要溢出
2 2 2 1 1   2是峰
2 2 4 1 1   4是峰
1 1 1 1 1   1是峰
1 1 1 1 3   3是峰
Output3
5 2 2 1 1

让输入的每个数据都成为峰,处理出新的数组,计算相应的和,and the total number of floors in all skyscrapers is the maximum possible.,选出最大的和。

AC代码如下

#include <stdio.h>
#define maxn 1010
#define LL long long
LL tot,sum;
int a[maxn],m[maxn],ans[maxn];
int min(int a,int b){
	return a<b?a:b;
}
int main(){
	int n,i,j;
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",&m[i]);
	for(i=1;i<=n;i++){
		a[i]=m[i],sum=m[i];//a[i]作为峰
		for(j=i-1;j>=1;j--)a[j]=min(m[j],a[j+1]),sum+=a[j];//峰的左侧
		for(j=i+1;j<=n;j++)a[j]=min(m[j],a[j-1]),sum+=a[j];//峰的右侧
		if(tot<sum){//找所有建筑总层数最多的情况
			tot=sum;
			for(j=1;j<=n;j++)ans[j]=a[j];//保存每个建筑楼层值
		}
	}
	for(i=1;i<n;i++)printf("%d ",ans[i]);
	printf("%d\n",ans[n]);
	return 0;
}

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值