• 回家-贪心


    Description

    “你幸福吗?”
    “不,我姓李。”
    “……不,我是问你感到幸福吗?”
    “幸福,我买到春运火车票啦!”
    春运一直是个很让人头疼的问题,人很多而载客量有限。现在请聪明的你来帮帮忙。
    面对的问题是这样的:一辆单趟火车,从1号站一直驶向N号站,可以看做在一数轴上,依次排列着1到N号站。火车一次最多只能坐C个人。如果客满了只有等乘客下车后才能承载新的乘客。现在有K组人,每组人的人数为pi,他们想在si号站上车,ti号站下车。当我们让一个乘客如愿以偿的到达了他的目的地,则我们达成了一名乘客回家的心愿。
    你的任务是合理的选择让哪些乘客上车,使得我们满足的乘客的心愿尽可能的多。注意,当我们选择了其中一组人,我们可以只让一部分人上车,而不一定是这一组的所有人。

    Input

    第一行三个整数K,N,C,含义与题目描述相同。
    接下来K行,每行给出了每一组人的信息:si,ti,pi,含义与题目描述相同。

    Output

    输出一个整数表示最多能满足多少乘客的心愿。

    Sample Input

    8 15 3
    1 5 2
    13 14 1
    5 8 3
    8 14 2
    14 15 1
    9 12 1
    12 15 2
    4 6 1

    Sample Output

    10

    Hint

    【数据规模及约定】
    对于30%的数据,1≤K,N,C≤20;
    对于60%的数据,1≤N≤5000,1≤K≤5000,1≤C≤100;
    对于100%的数据,1≤Pi≤N≤300000,1≤K≤200000,1≤C≤100 1≤si
    注意有可能两个不同的组si,ti,pi都相同


    思路

    • 贪心套数据结构(这里用线段树),以下车时间从小到大排序,能坐入车的乘客尽量都上

    代码

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #define maxn 300005
    #define inf 0x7fffffff
    using namespace std;
    int k,n,c,ans;
    struct node{int l,r,flag,minn;}e[maxn<<2];
    struct fdfdfd{int s,t,p;}a[maxn];
    bool cmp(fdfdfd a,fdfdfd b){return a.t<b.t||(a.t==b.t&&a.s<b.s);}
    void pushdown(int x){
    	if(!e[x].flag) return;
    	e[x<<1].flag+=e[x].flag; e[x<<1|1].flag+=e[x].flag;
    	e[x<<1].minn-=e[x].flag; e[x<<1|1].minn-=e[x].flag;
    	e[x].flag=0;
    }
    void pushup(int x){e[x].minn=min(e[x<<1].minn,e[x<<1|1].minn);}
    void build(int x,int left,int right)
    {
    	e[x].l=left; e[x].r=right;
    	if(left==right){e[x].minn=c; return;}
    	int mid=(left+right)>>1;
    	build(x<<1,left,mid); build(x<<1|1,mid+1,right);
    	pushup(x);
    }
    int query(int x,int left,int right)
    {
    	if(e[x].r<left||e[x].l>right) return inf;
    	if(left<=e[x].l&&right>=e[x].r) return e[x].minn;
    	pushdown(x);
    	return min(query(x<<1,left,right),query(x<<1|1,left,right));
    }
    void modify(int x,int left,int right,int d)
    {
    	if(e[x].r<left||e[x].l>right) return;
    	if(left<=e[x].l&&right>=e[x].r) {e[x].minn-=d;e[x].flag+=d;return;}
    	pushdown(x);
    	modify(x<<1,left,right,d); modify(x<<1|1,left,right,d);
    	pushup(x);
    }
    int main()
    {
    //	freopen("home.in","r",stdin);
    //	freopen("home.out","w",stdout);
    	scanf("%d%d%d",&k,&n,&c); build(1,1,n);
    	for(int i=1;i<=k;++i) scanf("%d%d%d",&a[i].s,&a[i].t,&a[i].p),--a[i].t;
    	sort(a+1,a+k+1,cmp);
    	for(int i=1;i<=k;++i)
    	{
    		int minn=min(query(1,a[i].s,a[i].t),a[i].p);
    		if(minn<=0) continue;
    		ans+=minn; modify(1,a[i].s,a[i].t,minn);
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    wex5 实战 框架拓展之2 事件派发与data刷新
    wex5 实战 框架拓展之1 公共data组件(Data)
    wex5 实战 HeidiSQL 导入Excel数据
    wex5 实战 手指触屏插件 hammer的集成与优劣
    wex5 实战 登陆帐号更换与用户id一致性
    wex5 实战 用户点评与提交设计技巧
    wex5 实战 省市县三级联动与地址薄同步
    wex5 实战 wex5与js的组件关系与执行顺序(父子与先后)
    wex5 实战 单页模式下的多页面数据同步
    [BZOJ]4237: 稻草人
  • 原文地址:https://www.cnblogs.com/wuwendongxi/p/13765544.html
Copyright © 2020-2023  润新知