种树
贪心
按照右端点排序,每一段都从后开始填,因为这样就填到了公用的部分,如果这样就满足了后一段,后一段计算时直接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; }