打地鼠游戏 中石油

http://exam.upc.edu.cn/problem.php?id=5502

伟大的2320学长特别喜欢打地鼠游戏,这个游戏开始后,会在地板上冒出一些地鼠来,你可以用榔头去敲击这些地鼠,每个地鼠被敲击后,将会增加相应的游戏分值。可是,所有地鼠只会在地上出现一段时间(而且消失后再也不会出现),每个地鼠都在0时刻冒出,但停留的时间可能是不同的,而且每个地鼠被敲击后增加的游戏分值也可能是不同。
最近2320学长经常玩这个游戏,以至于敲击每个地鼠只要1秒。他在想如何敲击能使总分最大。

输入

输入包含3行,第一行包含一个整数n(1<=n<=100000)表示有n个地鼠从地上冒出来,第二行n个用空格分隔的整数表示每个地鼠冒出后停留的时间(Maxt<=50000),第三行n个用空格分隔的整数表示每个地鼠被敲击后会增加的分值v(v<=1000)。每行中第i个数都表示第i个地鼠的信息。

输出

输出只有一行一个整数,表示所能获得的最大游戏总分值。

样例输入

5
5 3 6 1 4
7 9 2 1 5

样例输出

24

提示

30%的数据保证n<=100, t<=500,v<=50
60%的数据保证 n<=10000,t<=3000,v<=500
100%的数据保证 n<=100000,t<=5000,v<=1000

中文就不说题意了。有点贪心的思想,从最大加,一直到最小的(时间),所以从后往前加。

这个题本身不难,有很多方法做,但我没想到,就想到了上午刚刚看看的set的用法(可自定义从大到小排序)就想用set写,花了一个小时没弄出来,很遗憾,才明白set不能存重复的元素,查了好久找到了multiset,它是set的延伸,可以存重复的元素,可是还是wa,查了资料才知道它一删除就删除所有相同的元素,引入lower_bound()(找到所有相同元素最前边的那个),这样可以删除第一个。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<math.h>
#include<time.h>
#include<vector>
#include<set>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
using  namespace std;
int maxn (int a,int b,int c){return max(max(a,b),max(b,c));}
struct node {
     ll time,cost;
}a[100005];
struct cmp{
     bool operator()(node a,node b)
            {
                if(a.cost==b.cost) a.time>b.time;
                return a.cost>b.cost;
            }
};
multiset<node,cmp>sum;
ll cmp(node a,node b)
{
    if(a.time==b.time) a.cost<b.cost;
    return a.time<b.time;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i].time);
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i].cost);
    }
    sort(a+1,a+n+1,cmp);
    int tim=a[n].time;
    long long cos=0;
    int i=n;
    while(i>=0&&tim>0)
    {
        if(a[i].time>=tim)
        {
            sum.insert(a[i]);
            i--;
        }
        else {
            if(sum.empty()==true) {
                tim--; continue;
            }
            multiset<node>::iterator temp=sum.begin();
           //  multiset<node>::iterator temp1=sum.begin();
           /* for(temp=sum.begin;temp!=sum.rend();temp++)
            {
                if(temp->cost==temp1.cost&&temp->time==temp1.cost&&tim>=a[i].time)
                {
                    cos+=temp->cost;tim--;
                }
            }*/
             cos+=temp->cost;
            sum.erase(sum.lower_bound(*temp));
            tim--;
        }
    }
    printf("%lld\n",cos);
    return 0;
 }
 

猜你喜欢

转载自blog.csdn.net/qq_41485193/article/details/81191128