牛客小白月赛2 I.艺

牛客小白月赛2 I.艺

题目链接

题目描述

接下去,Sεlιнα 又搞了个文艺竞演。
虽说是文艺竞演,其实只是为了满足 Sεlιнα 的内心企盼——看群男友献歌献舞。她排列好了各个参赛男友的节目顺序,然后将他们安排在两个舞台上表演,自己则在演播室里使用两台闭路电视同时观看。万万没想到的是,当一切准备就绪时,其中一台电视炸了,她不会修,也没有时间修。于是只能尴尬地使用一台闭路电视观看两个舞台上的节目。当然,这台电视不支持分屏同时观看,所以 Sεlιнα 只能不停地换台观看。现在,作为导演的 Sεlιнα 已经知道了两个舞台的节目 单以及每个节目 i 对于她所能产生的愉悦度 v i v_i vi ,她想安排电视在每个时刻播放的频道(可以在某些时刻不看),使得自己能得到最大的愉悦度。现在请优秀的你告诉 Sεlιнα 最大能产生的愉悦度是多少。
要注意的是,文艺竞演没有广告插播,所以当一个节目结束时,另一个节目会立刻开始演出。 并且 Sεlιнα 看节目以分钟为单位,也就是说,她只能在每分钟结束的那一刻切换舞台。节目对 Sεlιнα 产生愉悦度是以分钟为单位的,也就是说,她看第 ii 个节目每一分钟就会产生 v i v_i vi 的愉悦度。而 Sεlιнα 对节目的完整性丝毫不在意,没有完整地看一个节目是没有关系的。

输入描述:

第一行三个数 N,M,T,表示舞台一有 N 个节目,舞台二有 M 个节目,总时长为 T 分钟。
接下去 N 行,每行两个整数 x i , v i x_i, v_i xi,vi,表示舞台一的第 i 个节目在第 x i x_i xi 分钟结束后开始,每分钟能产生愉悦度 v i v_i vi。当一个节目开始时,这个舞台之前正在播放的节目直接停止,中间没有暂停。
接下去 M 行,每行两个整数 x j , v j x_j,v_j xj,vj,表示舞台二的第 j 个节目在第 x j x_j xj 分钟结束后开始,每分钟能产生愉悦度 v j v_j vj。当一个节目开始时,这个舞台之前正在播放的节目直接停止,中间没有暂停。
数据保证每个舞台都有一个在 0 分钟时开始的节目(即最开始的节目),并且在同一个舞台中没有两个节目开始时间相同(即没有一个节目时长为 0)。数据不保证输入中每个舞台的 x i x_i xi 会从小到大排序。

输出描述:

输出共一行,一个整数,表示最大的愉悦度。

示例1

输入

2 2 5
2 3
0 2
0 3
3 1

输出

15

示例2

复制

3 4 17
8 3
0 10
9 10
7 15
0 6
16 9
14 8

输出

205

直接贪心,对每一个时刻,考虑在舞台一,舞台二和不看电视三者中选一个,我看题解很多都是遍历 T 的,明显数据水了,应该实时变化时间才对,否则按道理应该会 T,AC代码如下:

#include
using namespace std;
typedef long long ll;
const int N=1e5+5;
vector<pair<ll,ll>>v1,v2;
int n,m,p1=0,p2=0;
ll t,x,y,ans=0,pre=0,now=0,tmp;
int main()
{
    scanf("%d%d%lld",&n,&m,&t);
    while(n--){
        scanf("%lld%lld",&x,&y);
        v1.push_back({x,y});
    }
    while(m--){
        scanf("%lld%lld",&x,&y);
        v2.push_back({x,y});
    }
    v1.push_back({t,0});
    v2.push_back({t,0});
    sort(v1.begin(),v1.end());
    sort(v2.begin(),v2.end());
    while(now<t){
        tmp=max(v1[p1].second,v2[p2].second);
        pre=now;
        now=min(v1[p1+1].first,v2[p2+1].first);
        if(tmp>0) ans+=(now-pre)*tmp;
        if(now==v1[p1+1].first) p1++;
        if(now==v2[p2+1].first) p2++;
    }
    printf("%lld",ans);
}

你可能感兴趣的:(贪心,牛客,pair)