JZOJ 1294. 轻轨

目录:


题目:

单击查看题目


分析:

听我们队中的很多dalao说,可以用贪心+线段树优化,只能%%%,但小编想说,贪心也可以很优秀:
这里写图片描述
代码很短,但炒鸡难理解,在洛谷上什么注释都没有,我硬是花了一下午才理解,但是,当你们看到此文时,那么就是赚到了:
首先说下,这道题跟活动安排很想,所以我们可以将站点比作时间,同时需要点队列思维,在讲代码时会用到,请各位大佬等下翻回看:
这一组的数据为:上车:3 下车:6 牛数:2
这里写图片描述


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define LL long long
using namespace std;
inline LL read() {
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}
struct cow{
    int b,e,num;
}x[50001];
int h[20001];
bool cmp(cow a,cow b)
{
    if(a.e==b.e) return a.b<b.b;
    else return a.e<b.e;
}
int ans;
int main()
{
    int n=read(),m=read(),c=read();
    for(int i=1;i<=n;i++) x[i].b=read(),x[i].e=read(),x[i].num=read();
    sort(x+1,x+1+n,cmp);//按照下车时间排序,如果相等,那再按上车时间排序
    int w,p;
    for(int i=1;i<=n;i++)
    {
        //h类似于一个时间戳,记录下每次车子会停下的时间
        if(x[i].b<h[1]) continue;//当车子不会停留时,因为之前排过序,所以pass
        w=1;//w用来求当前这一组我们可以上多少头牛
        while(w<=x[i].num&&w<=c&&x[i].b>=h[w]) w++;
        //对于x[i].b>=h[w],表示我们之前车子还会有牛下站,而我们当前组的牛就可以上了
        w--;
        //p用来找到第一个大于上车时间的时间..
        for(p=1;p<=c;p++)
          if(h[p]>x[i].b) break;
        p-=w;//求出我们滚动操作的起始位置,可以看图了↑
        while(h[p+w]<x[i].e&&p+w<=c) h[p]=h[p+w],p++;//滚动-important
        for(int j=1;j<=w;j++)
          h[p++]=x[i].e;//把我们这组上车的牛的终点记录下来
        ans+=w;//累加求解
    }
    printf("%d",ans);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值