码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 4864 Task(贪心)

时间:2014-07-22 23:46:58      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   

HDU 4864 Task

题目链接

题意:有一些机器和一些任务,都有时间和等级,机器能做任务的条件为时间等级都大于等于任务,并且一个任务只能被一个机器做,现在求最大能完成任务,并且保证金钱尽量多

思路:贪心,对于每个任务,时间大的优先去匹配,时间相同的,等级大的优先去匹配,因为时间占得多,时间多1就多500,而等级最多才差200。然后匹配的时候,尽量使用等级小的去匹配,而时间只要大于它的都可以用,因为是按时间优先,所以如果该时间能匹配大的,其他肯定也能匹配,那么肯定优先匹配大的,所以只要在等级上尽量小就可以了

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

typedef __int64 ll;
const int N = 1444;
const int M = 105;
int n, m;
ll mac[N][M], task[N][M], used[N];

int main() {
    while (~scanf("%d%d", &n, &m)) {
	int x, y;
	memset(mac, 0, sizeof(mac));
	memset(task, 0, sizeof(task));
	memset(used, 0, sizeof(used));
	for (int i = 0; i < n; i++) {
	    scanf("%d%d", &x, &y);
	    mac[x][y]++;
	}
	for (int i = 0; i < m; i++) {
	    scanf("%d%d", &x, &y);
	    task[x][y]++;
	}
	for (int i = 0; i <= 100; i++) {
	    for (int j = 1439; j > 0; j--) {
		mac[j][i] += mac[j + 1][i];
	    }
	}
	ll num = 0;
	ll ans = 0;
	for (ll i = 1439; i > 0; i--) {
	    for (ll j = 100; j >= 0; j--) {
		if (!task[i][j]) continue;
		for (ll k = j; k <= 100; k++) {
		    if (task[i][j] > mac[i][k] - used[k]) {
			num += mac[i][k] - used[k];
			ans += (mac[i][k] - used[k]) * (i * 500 + j * 2);
			task[i][j] -= (mac[i][k] - used[k]);
			used[k] = mac[i][k];
		    }
		    else {
			num += task[i][j];
			ans += task[i][j] * (i * 500 + j * 2);
			used[k] += task[i][j];
			task[i][j] = 0;
			break;
		    }
		}
	    }
	}
	printf("%I64d %I64d\n", num, ans);
    }
    return 0;
}


HDU 4864 Task(贪心),布布扣,bubuko.com

HDU 4864 Task(贪心)

标签:style   blog   http   color   使用   os   

原文地址:http://blog.csdn.net/accelerator_/article/details/38052535

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!