zoukankan      html  css  js  c++  java
  • 回家-贪心

    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;
    }
    
  • 相关阅读:
    【redis】--安全
    【redis】-- 数据备份和恢复
    2018.2.8 cf
    寒假零碎的东西 不定时更新补充.......
    hdu 1018
    2018寒假acm训练计划
    UVAlive 7466
    母函数
    简单数学题(水的不能在水的题了)
    随便写写的搜索
  • 原文地址:https://www.cnblogs.com/wuwendongxi/p/13765544.html
Copyright © 2011-2022 走看看