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;
}

posted on 2024-12-11 17:09  gryzy  阅读(2)  评论(0编辑  收藏  举报

导航