回家-贪心

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;
}
原文地址:https://www.cnblogs.com/wuwendongxi/p/13765544.html