题目大意:n个站点,有m群奶牛,第i群奶牛有mi只,要从si站点出发,直到ti站点下车。
对于一群奶牛,可以不全部上车。同时在车上的奶牛数不能超过c,求最多能满足多少头奶牛的要求。
注意到可以不全部上车,那么贪心的思路就比较明确了
尽量让下车下得早的多上车,这样利益可以最大化
某些细节还是挺磨人的
1 #include<cstdio> 2 #include<cstdlib> 3 #include<iostream> 4 #include<algorithm> 5 #include<vector> 6 #include<set> 7 #define be *S.begin() 8 #define ed *S.rbegin() 9 #define vv G[i][j].first 10 #define ww G[i][j].second 11 using namespace std; 12 const int N=50010; 13 int k,n,c; 14 vector<pair<int,int> > G[N]; 15 set<int> S; 16 int t[N]; 17 int main(){ 18 #ifndef ONLINE_JUDGE 19 freopen("fs.in","r",stdin);freopen("fs.out","w",stdout); 20 #endif 21 scanf("%d%d%d",&k,&n,&c); 22 while(k--){ 23 int u,v,w; 24 scanf("%d%d%d",&u,&v,&w); 25 G[u].push_back(make_pair(v,w)); 26 } 27 for(int i=1;i<=n;++i)sort(G[i].begin(),G[i].end()); 28 int ans=0,in_car=0; 29 for(int i=1;i<=n;++i){ 30 int j=0,j_end=G[i].size(); 31 if(!S.empty()&&be==i){ 32 ans+=t[be];in_car-=t[be]; 33 S.erase(be); 34 }//calc the number of the satisfy cow 35 for(;j<j_end&&in_car<c;++j){ 36 int go_into=min(c-in_car,ww); 37 t[vv]+=go_into;in_car+=go_into;ww-=go_into; 38 S.insert(vv); 39 if(in_car==c)break; 40 }//get on the red bus or blablabla,if the bus can be filled,fill it 41 for(;j<j_end&&vv<ed;++j) 42 while(!S.empty()&&ww){ 43 int go_into=min(ww,t[ed]); 44 t[ed]-=go_into,t[vv]+=go_into; 45 S.insert(vv); 46 if(!t[ed])S.erase(ed); 47 ww-=go_into; 48 }//sacrifice others‘ advantage to get the best advantage 49 } 50 printf("%d\n",ans); 51 return 0; 52 }
时间: 2024-10-02 18:53:32