社区讨论

P5019 分治做法

P5019[NOIP 2018 提高组] 铺设道路参与者 7已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@m3mywb5e
此快照首次捕获于
2024/11/18 19:53
去年
此快照最后确认于
2025/11/04 14:27
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,a[100010],ans;
void floor(int x,int y){
	int minn=0x7ffffff,p,i;
	if(x>y) return;
	for(i=x;i<=y;i++){
		p=a[i]<minn? i:p;
		minn=a[i]<minn? a[i]:minn;
	}
	for(i=x;i<=y;i++){
		a[i]-=minn;
	}
	ans+=minn;
	floor(x,p-1);
	floor(p+1,y);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	floor(1,n);
	cout<<ans;
}
思路:这段代码用分治的思想求解问题,首先为了最省时间,肯定要先尽可能把连在一起的路一起处理,不妨先处理一边,直到有一个地方被填平从而不能在继续进行我们尽可能大块处理的措施,然后分成两块以此类推,每块都是如此思路,直到某块已经没有道路。 代码原理留给大家理解。

回复

9 条回复,欢迎继续交流。

正在加载回复...