牛客-小白月赛2-I-艺

链接:https://www.nowcoder.com/acm/contest/86/I
来源:牛客网


题目描述 
接下去,Sεlιнα(Selina) 又搞了个文艺竞演。
虽说是文艺竞演,其实只是为了满足 Sεlιнα 的内心企盼——看群男友献歌献舞。她排列好了各个参赛男友的节目顺序,然后将他们安排在两个舞台上表演,自己则在演播室里使用两台闭路电视同时观看。万万没想到的是,当一切准备就绪时,其中一台电视炸了,她不会修,也没有时间修。于是只能尴尬地使用一台闭路电视观看两个舞台上的节目。当然,这台电视不支持分屏同时观看,所以 Sεlιнα 只能不停地换台观看。现在,作为导演的 Sεlιнα 已经知道了两个舞台的节目 单以及每个节目  对于她所能产生的愉悦度  ,她想安排电视在每个时刻播放的频道(可以在某些时刻不看),使得自己能得到最大的愉悦度。现在请优秀的你告诉 Sεlιнα 最大能产生的愉悦度是多少。
要注意的是,文艺竞演没有广告插播,所以当一个节目结束时,另一个节目会立刻开始演出。 并且 Sεlιнα 看节目以分钟为单位,也就是说,她只能在每分钟结束的那一刻切换舞台。节目对 Sεlιнα 产生愉悦度是以分钟为单位的,也就是说,她看第  个节目每一分钟就会产生  的愉悦度。而 Sεlιнα 对节目的完整性丝毫不在意,没有完整地看一个节目是没有关系的。?
输入描述:
第一行三个数 ,表示舞台一有  个节目,舞台二有  个节目,总时长为  分钟。
接下去  行,每行两个整数  ,表示舞台一的第  个节目在第 ?分钟结束后开始,每分钟能产生愉悦度  。当一个节目开始时,这个舞台之前正在播放的节目直接停止,中间没有暂停。
接下去  行,每行两个整数  ,表示舞台二的第  个节目在第  分钟结束后开始,每分钟能产生愉悦度  。当一个节目开始时,这个舞台之前正在播放的节目直接停止,中间没有暂停。
数据保证每个舞台都有一个在  分钟时开始的节目(即最开始的节目),并且在同一个舞台中没有两个节目开始时间相同(即没有一个节目时长为 )。数据不保证输入中每个舞台的  会从小到大排序。?
输出描述:
输出共一行,一个整数,表示最大的愉悦度。
示例1
输入
2 2 5
2 3
0 2
0 3
3 1
输出
15
说明
在这个样例中,Sεlιнα 在开始时观看频道二的节目,每分钟产生愉悦度  ;在第二分钟结束时刻切换到频道一,每分钟产生愉悦度  ,然后直到结束。总共产生愉悦度 ?。?
示例2
输入
3 4 17
8 3
0 10
9 10
7 15
0 6
16 9
14 8
输出
205
备注:
1<=N,M<=10^5
1<=T<=10^9
-100<=vi<=100

思路:对a[n],b[n]按开始时间排序,遍历时间T,对于每个时间区间,取a[],b[]中的价值最大值即可

Code :

//a[n],b[n]按照开始时间排序,对于每个区间,只要取其最大价值即可 
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;

struct node{
	int l;
	int w;
	bool operator<(const node &p){
		return l<p.l;
	}
};
const int MAX_N=100005;
const int MAX_M=100005;
int n,m,T;
node a[MAX_N],b[MAX_N];

int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m>>T;
	for(int i=0;i<n;++i)
		cin>>a[i].l>>a[i].w;
	for(int i=0;i<m;++i)
		cin>>b[i].l>>b[i].w;
	sort(a,a+n);
	sort(b,b+m);
	a[n].l=b[m].l=T;
	LL ans=0;
	int la=0,lb=0,k=0;
	while(la<n&&lb<m&&k<T){
		if(k>=a[la].l)	la++;
		if(k>=b[lb].l)	lb++;
		int t=min(a[la].l,b[lb].l);
		ans+=(t-k)*max(0,max(a[la-1].w,b[lb-1].w));
		k=t;
	}
	while(la<n&&k<T){
		if(k>=a[la].l)	la++;
		ans+=(a[la].l-k)*max(0,max(a[la-1].w,b[m-1].w));
		k=a[la].l;
	}
	while(lb<m&&k<T){
		if(k>=b[lb].l)	lb++;
		ans+=(b[lb].l-k)*max(0,max(a[n-1].w,b[lb-1].w));
		k=b[lb].l;
	}
	cout<<ans<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值