公交车(bus)
Time Limit:1000ms Memory Limit:128MB
题目描述
LYK在玩一个游戏。
有k群小怪兽想乘坐公交车。第i群小怪兽想从xi出发乘坐公交车到yi。但公交车的容量只有M,而且这辆公交车只会从1号点行驶到n号点。
LYK想让小怪兽们尽可能的到达自己想去的地方。它想知道最多能满足多少小怪兽的要求。
当然一群小怪兽没必要一起上下车,它们是可以被分开来的。
输入格式(bus.in)
第一行三个数k,n,M。
接下来k行每行3个数xi,yi和ci。其中ci表示第i群小怪兽的小怪兽数量。
输出格式(bus.out)
一个数表示最多有多少只小怪兽能满足要求。
输入样例
3 5 3
1 3 4
3 5 2
1 5 3
输出样例
5
样例解释
第一群的3只小怪兽在1号点上车,并在3号点下车。
第二群的2只小怪兽在3号点上车,5号点下车。
数据范围
对于30%的数据小怪兽的总数不超过10只,n<=10。
对于另外30%的数据k,n<=1000。
对于100%的数据1<=n<=20000,1<=k<=50000,1<=M<=100,1<=ci<=100,1<=xi<yi<=n。
很容易可以看出此题可以转化成线段覆盖问题
然后每次暴力修改区间球可以,因为数据水,你也可以某些数据结构优化
#include<cstdio> #include<algorithm> using namespace std; const int maxn = 50005; int k,n,m; struct node{ int h,t,num; bool operator < (const node & a)const { return t<a.t; return h<a.t; } }edge[maxn]; int peo[maxn]; int main () { scanf("%d%d%d",&k,&n,&m); for(int i=1;i<=k;++i) { scanf("%d%d%d",&edge[i].h,&edge[i].t,&edge[i].num); } sort(edge+1,edge+k+1);int ans=0; for(int i=1;i<=k;++i) { if(edge[i].t>n)break; if(peo[edge[i].h]>=m)continue; int minn=0x7fffffff; for(int j=edge[i].h;j<=edge[i].t;++j){minn=min(m-peo[j],minn);if(minn<=0)break;} if(minn>0) { if(minn>=edge[i].num) { for(int j=edge[i].h;j<edge[i].t;++j)peo[j]+=edge[i].num; ans+=edge[i].num; } else { for(int j=edge[i].h;j<edge[i].t;++j)peo[j]+=minn; ans+=minn; } } } printf("%d\n",ans); return 0; }