P5019 分治做法
查看原帖
P5019 分治做法
1501877
wuzebang2009楼主2024/11/18 19:53
#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;
}

思路:这段代码用分治的思想求解问题,首先为了最省时间,肯定要先尽可能把连在一起的路一起处理,不妨先处理一边,直到有一个地方被填平从而不能在继续进行我们尽可能大块处理的措施,然后分成两块以此类推,每块都是如此思路,直到某块已经没有道路。 代码原理留给大家理解。

2024/11/18 19:53
加载中...