51node 1163 贪心

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍。求能够获得的最高奖励。
Input
第1行:一个数N,表示任务的数量(2 <= N <= 50000)
第2 - N + 1行,每行2个数,中间用空格分隔,表示任务的最晚结束时间E[i]以及对应的奖励W[i]。(1 <= E[i] <= 10^9,1 <= W[i] <= 10^9)
Output
输出能够获得的最高奖励。
Input示例
7
4 20
2 60
4 70
3 40
1 30
4 50
6 10
Output示例
230


题意:中文题目不解释

思路:让你求能够得到的最高奖励,在截止时间之前都可以选择,用一个优先队列存可能得到的奖励,根据时间从大到小处理,当进入一个新的时间点或时间段时跟新答案,主要是贪心思想配合上优先队列。

#include<stdio.h>
#include<string.h>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#define ll long long
#define qq printf("QAQ\n");
using namespace std;
const int maxn=1e5+5;
struct node{
    int t;
	ll w;
}a[maxn];
bool cmp(node a,node b)
{
	return a.t>b.t;
}
int main()
{
    int n,m,w;
    while(scanf("%d",&n)!=EOF)
    {
    for(int i=0;i<n;i++)
    {
        scanf("%d%lld",&a[i].t,&a[i].w);
    }
    sort(a,a+n,cmp);
    priority_queue<int,vector<int>,greater<int> >q1;//小的优先
    priority_queue<ll>q;//大者优先
    int f=-1;
	ll ans=0;
    for(int i=0;i<=n;i++)
    {
        if(f==-1||a[i].t==f){
            q.push(a[i].w);
            f=a[i].t;
        }
        else {
        	while(f!=a[i].t&&!q.empty())
        	{
        		ans+=q.top();
            	q.pop();
            	f--;
			}
           q.push(a[i].w);
            f=a[i].t;
        }
    }
    printf("%lld\n",ans);
	}
    return 0;
}

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页