题目链接:HDU 4864 Task
1 2 100 3 100 2 100 1
1 50004
题意:
有n个机器,m个任务。每个机器至多能完成一个任务。对于每个机器,有一个最大运行时间xi和等级yi,对于每个任务,也有一个运行时间xj和等级yj。只有当xi>=xj且yi>=yj的时候,机器i才能完成任务j,并获得500*xj+2*yj金钱。问最多能完成几个任务,当出现多种情况时,输出获得金钱最多的情况。
分析:
这样的题目在比赛的时候没有做出来只能说我太水。从一开头就知道了贪心的基本思路。就是先将任务和机器按降序排列(先时间,时间相同再按难度),然后采用贪心求解。当时脑洞太大,先选择机器,在选择该机器能完成的最大利润的任务,但是选择下一个机器的时候,忘了考虑被上一个机器忽略的那些任务,导致无限WA,到最后才想到有这一茬。网上给的题解是先选任务然后再选适合的最小机器。按照题解稍微修改了自己的代码然后AC了,其实和先选机器的思想是一致的,唉,太蠢没有办法。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define maxn 100010
struct node{
int tm, dif;
}MCH[maxn], TSK[maxn];
bool cmp(node a, node b)
{
if(a.tm==b.tm) return a.dif > b.dif;
return a.tm > b.tm;
}
int main()
{
int n, m;
while(~scanf("%d%d", &n, &m))
{
for(int i = 1; i <= n; i++)
scanf("%d%d", &MCH[i].tm, &MCH[i].dif);
for(int i = 1; i <= m; i++)
scanf("%d%d", &TSK[i].tm, &TSK[i].dif);
sort(MCH+1, MCH+n+1, cmp);
sort(TSK+1, TSK+m+1, cmp);
int cnt = 0, c[102];
__int64 sum = 0;
memset(c, 0, sizeof(c));
for(int i = 1, j = 1; i <= m; i++)
{
while(j <= n && MCH[j].tm >= TSK[i].tm)
{
c[MCH[j].dif]++;
j++;
}
for(int k = TSK[i].dif; k <= 100; k++)
{
if(c[k])
{
cnt++;
c[k]--;
sum += 500*TSK[i].tm+2*TSK[i].dif;
break;
}
}
}
printf("%d %I64d\n", cnt, sum);
}
return 0;
}
原文地址:http://blog.csdn.net/u011439796/article/details/38051691