种树

贪心

按照右端点排序,每一段都从后开始填,因为这样就填到了公用的部分,如果这样就满足了后一段,后一段计算时直接cotinue,否则再从后开始填

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=30007;
const int maxh=5007;
bool vis[maxn];
int n,h,k,ans;
struct Hos{
    int s,t,val;
}hos[maxn];
bool cmp(Hos a,Hos b){
    return a.t<b.t;
}
int main(){
    cin>>n>>h;
    for(int i=1;i<=h;i++){
        cin>>hos[i].s>>hos[i].t>>hos[i].val;
    }
    sort(hos+1,hos+h+1,cmp);
    for(int i=1;i<=h;i++){
        k=0;
        for(int j=hos[i].s;j<=hos[i].t;j++)
            if(vis[j]) k++;
        if(k>=hos[i].val) continue;
        for(int j=hos[i].t;j>=hos[i].s;j--){
            if(!vis[j]){
                vis[j]=true;
                k++;ans++;
                if(k==hos[i].val) break; 
            }
        }
    }
    cout<<ans<<endl;
    return 0;
} 
原文地址:https://www.cnblogs.com/lcan/p/9581181.html