ybt1672
1672:游戏通关
时间限制: 1000 ms 内存限制: 262144 KB
【题目描述】
XY在玩一个包含\(N\)个任务的游戏。每个任务完成时限为\(T_i\)(你可以认为还没开始做任务时的时间为0),奖励为\(W_i\)。由于XY技术的娴熟以及任务的简单,对于每个任务,他都可以在一个单位时间内完成。
XY想要知道他能够获得的最多的奖励。
【输入】
第一行一个整数\(N\),表示需要完成的任务数目。
接下来\(N\)行,每行两个整数\(T、W\),分别表示完成这个任务的最后期限和完成这个任务后获得的奖励。
【输出】
输出数据有且仅有一行,只包含一个整数,表示最多获得的奖励。
【输入样例】
2
1 5
1 4
【输出样例】
5
【提示】
【样例输入2】
5
2 3
1 2
4 5
1 3
3 4
【样例输出2】
15
【样例解释2】
对于样例2,XY可以选择完成任务1、3、4 和5,这样他可以获得奖励15。
【数据规模及约定】
对于10%的数据,\(N≤100,T_i≤100,W_i≤2000\)。
对于30%的数据,\(N≤1000,T_i≤5000,W_i≤2000\)。
对于50%的数据,\(N≤10000,T_i≤20000,W_i≤2000\)。
对于100%的数据,\(N≤200000,T_i≤200000,W_i≤2000\)。
贪心
1、建立越大的优先选择
2、一个任务尽量靠后安排
初次测试80分
注意时间可能比任务大,也就是10个任务,但时间为20。这个被扣了20分。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
struct ta
{
int val,tim;
}t[maxn];
int pro[maxn];
int n,nn;
bool don[maxn];
long long ans;
bool cmp(ta a,ta b)
{
return a.val>b.val;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d%d",&t[i].tim,&t[i].val),nn=max(nn,t[i].tim);
sort(t+1,t+n+1,cmp);
for(int i=1;i<=nn;++i)pro[i]=i;
for(int pp,v,p,i=1;i<=n;++i)
{
v=t[i].val,p=t[i].tim;
if(pro[p]!=0)
{
pp=pro[p];
don[pp]=1;ans+=v;
pro[p]=pro[pp-1];
}
}
cout<<ans<<endl;
return 0;
}