1 solutions

  • 1
    @ 2024-7-15 19:12:45
    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int n;
    int a[100005]={};
    int ans=0;
    int at=0;
    void build(int l,int r){
    	int mn=0x3f3f3f3f;
    	for(int i=l;i<=r;i++) if(a[i]<mn){
    		mn=a[i];
    		at=i;
    		//更新最小值和零点 
    	}
    	for(int i=l;i<=r;i++) a[i]-=mn;
    	//建造 
    	ans+=mn;
    	//ans更新 
    	return;
    }
    void dfs(int l,int r){
    	if(l>r) return;
    	//如果为负区间就退出 
    	build(l,r);
    	//操作函数 
    	dfs(l,at-1);
    	dfs(at+1,r);
    	//从零点左右再递归 
    }
    signed main(){
    	cin>>n;
    	for(int i=0;i<n;i++) cin>>a[i];
    	dfs(0,n-1);
    	//开始递归 
    	cout<<ans<<"\n";
    	return 0;
    }
    

    P5019 [NOIP2018 提高组] 铺设道路 基本一致

    我用的是dfs,贪心更快

    • 1

    Information

    ID
    930
    Time
    1000ms
    Memory
    125MiB
    Difficulty
    3
    Tags
    # Submissions
    18
    Accepted
    16
    Uploaded By