频道栏目
首页 > 资讯 > C++ > 正文

uvalive 2757(贪心)

15-03-25        来源:[db:作者]  
收藏   我要投稿

题意:有n个任务,给出了每个任务的奖金和期限,每个任务完成都要1个时间单位,问选择一些任务都按时完成可以得到的最多奖金是多少。

题解:先按时间排序,倒着枚举所有时间点,给它分配奖金最大的且未被分配的任务。

 

#include 
#include 
#include 
using namespace std;
const int N = 10005;
struct P {
	int pi, d, flag;
}p[N];
int n, res;

bool cmp(P a, P b) {
	if (a.d != b.d)
		return a.d < b.d;
	return a.pi > b.pi;
}

void solve(int dt) {
	for (int i = dt; i >= 1; i--) {
		int maxx = -1, index;
		for (int j = n - 1; j >= 0, p[j].d >= i; j--) {
			if (!p[j].flag && maxx < p[j].pi) {
				maxx = p[j].pi;
				index = j;
			}
		}
		if (maxx != -1) {
			p[index].flag = 1;
			res += maxx;	
		}
	}
}

int main() {
	while (scanf("%d", &n) == 1) {
		for (int i = 0; i < n; i++)
			p[i].flag = 0;
		for (int i = 0; i < n; i++)
			scanf("%d%d", &p[i].pi, &p[i].d);
		sort(p, p + n, cmp);
		int dt = p[n - 1].d;
		res = 0;
		solve(dt);
		printf("%d\n", res);
	}
}

 

相关TAG标签
上一篇:Android开发中对WebView的简单使用
下一篇:二叉树的层次遍历
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站