基准时间限制: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
题意:题目的意思很简单,即给你几组数据,每组包任务完成的deadline和获得的point,问最多能获得多少分。
解析:贪心题。贪心策略:每次取尽可能大的分数,而且保证每次deadline尽可能的大。方法:先用排序算法,按照point的由大到小排列,如果point一样,那么就按照deadline的由大到小排列,然后再根据deadline挨个判断是否能被取。最后把和输出即可。
#include <stdio.h>
#include <stdlib.h>
int flag[50000];
typedef struct works
{
int deadline;
int point;
} T;
T arr[50000];
int cmp(const void*a,const void*b)
{
T *A=(T *)a;
T *B=(T *)b;
if(A->point!=B->point) return B->point-A->point;
else return B->deadline-A->deadline;
}
int main()
{
int N;
//freopen("in.txt","r",stdin);
scanf("%d",&N);
for(int i=0; i<N; i++)
scanf("%d%d",&arr[i].deadline,&arr[i].point);
qsort(arr,N,sizeof(T),cmp);
int t=arr[0].deadline;
for(int i=1; i<N; i++)
if(arr[i].deadline>t) t=arr[i].deadline;
long long sum=0;
for(int i=0; i<t; i++)
flag[i]=1;
for(int i=0; i<N; i++)
{
int tmp=arr[i].deadline;
for(int j=tmp-1; j>=0; j--)
{
if(flag[j]==1) //遇到相同的日期往前顺延
{
flag[j]=0;
sum+=arr[i].point;
break;
}
}
}
printf("%lld\n",sum);
return 0;
}