jzoj3928【NOIP2014模拟11.6】射击(贪心)

来源:互联网 发布:博实股份人工智能 编辑:程序博客网 时间:2024/06/04 23:56

3928. 【NOIP2014模拟11.6】射击

Description

有问题,找副连,无聊的时候当然也可以找他啦。小W找到了他的叔叔——东厂厂长——宇宙超级无敌老WS yy。他们叔侄两个商量之后决定用弹弓打破社区里的一些窗户,但是弹弓每秒只能彻底打破一扇窗户。而且如果某户窗户的主人回来了的话,他们就不能进行破坏了(不然会死得很惨的)。因为有的人装的玻璃好,有的人装的玻璃差,有的人装的玻璃高,有的人装的玻璃矮,所以你不能要求他们叔侄两个打破不同的窗户获得的快乐值必须相同。现在他们想知道在能活着的情况下能够获得的最大快乐值。

Input

第一行一个正整数n,表示共有n个窗户。
接下来n行,每行两个整数,第一个为窗子的主人回来的时刻(秒),第二个为破坏该窗户所能获得的快乐值。

Output

最大的快乐值。

分析:按快乐值降序排序,把当前值放在左边最近的一个时刻,由于时刻很大,所以要把每个时刻%10000000。

代码

#include <cstdio>#include <algorithm>#define maxn 300000using namespace std;struct arr{    int t,x;}a[maxn];int n,b[10000000];int mcmp(arr p,arr q){    return p.x>q.x;}int main(){    scanf("%d",&n);    int k=0;    long long ans=0;    for (int i=1;i<=n;i++)        scanf("%d%d",&a[i].t,&a[i].x);    sort(a+1,a+n+1,mcmp);    for (int i=1;i<=n;i++)    {        a[i].t%=1000000;        if (a[i].t==a[i-1].t) k--;            else k=a[i].t-1;        while (k>=0&&b[k]>0) k--;        if (a[i].x>0&&k>=0) ans+=a[i].x;        if (a[i].x>0&&k>=0) b[k]=a[i].x;    }    printf("%lld",ans); }