一個沒有被我成功證明的
貪心
但是
ac了的
別人排序都是排終點.但我的排終點錯了emm排起點才對qvq
有沒有人友情看看怎么證(沒有

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,c,k,now=0,ans=0,maxx=0,cnt=1;//now現在在車上的,maxx目前到達最遠的站,cnt累計上到第幾批了 int q[20010];//到i下車的牛數 struct node { int s,e,m; }kk[50010]; bool cmp(node a,node b){return a.s<b.s;} void emm(int i) { if(c>=now+kk[i].m) { q[kk[i].e]+=kk[i].m; now+=kk[i].m; maxx=max(maxx,kk[i].e); return; }else { int nup=now+kk[i].m-c;//這一組全上去 會多出來的 for(int j=maxx;j>kk[i].e&&nup>0;j--)//要給i波牛空位置 { int end=q[j]; q[j]=max(0,q[j]-nup);//趕走一些牛//因為 它在kk[i].e以前的位置已經有第i波的那幾只可以代替了,所以,它要把從kk[i].e到最后的位置給空出來 讓給之后的牛 maxx=j; nup-=(end-q[j]); } //若還沒有牛到kk[i].e的位置.第i波能上幾只上幾只emm就跳過了j循環 now=c; q[kk[i].e]+=kk[i].m-nup; maxx=max(maxx,kk[i].e); } } int main() { int i,j; scanf("%d%d%d",&k,&n,&c); for(i=1;i<=k;i++)scanf("%d%d%d",&kk[i].s,&kk[i].e,&kk[i].m); sort(kk+1,kk+k+1,cmp); cnt=1; for(i=1;i<=n;i++) { if(q[i])//有牛可以下車啦 { ans+=q[i];now-=q[i]; q[i]=0; } while(kk[cnt].s==i) { emm(cnt);cnt++; } } printf("%d\n",ans); return 0; }