设为首页 加入收藏

TOP

HDU 4864 Task(贪心)
2015-07-20 18:04:41 来源: 作者: 【 】 浏览:2
Tags:HDU 4864 Task 贪心

HDU 4864 Task

题目链接

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

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

代码:

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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇poj1639 Picnic Planning 最小度.. 下一篇leetcode:程序员面试技巧

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: