廟會捷運Fair Shuttleの思路


一個沒有被我成功證明的

貪心

但是

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;
}
點擊查看我丑陋の代碼&注釋

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM