YbtOJ练习:贪心2 砍树问题

http://noip.ybtoj.com.cn/contest/12/problem/2

根据定义,我们可得,对任意两棵树,如果它们不会相互遮挡:

 

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,inf=0x3f3f3f3f;
int n,ans;
struct node{
    int p,a;
    bool operator <(const node &G)const
    {
        return p<G.p;
    }
}tr[N];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d%d",&tr[i].p,&tr[i].a);
    sort(tr+1,tr+n+1);
    tr[0].p=inf;tr[n+1].p=inf;
    for(int i=1;i<=n;i++)
    {
        int mind=min(abs(tr[i].p-tr[i-1].p),abs(tr[i].p-tr[i+1].p));
        ans+=max(0,tr[i].a-mind);
        tr[i].a=mind;
    }
    printf("%d",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/smartljy/p/13431655.html