GRYZY #8. 公交车

公交车(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;
}

 

posted @ 2017-10-19 16:18  zzzzx  阅读(298)  评论(0编辑  收藏  举报