标签:des style blog http java color os strong
题目链接:
题目:
1 2 100 3 100 2 100 1
1 50004
思路:
首先考虑获得的报酬。。500*xi+2*yi,所以yi可以当做次要因素,主观因素是时间。所以对任务,和机器的时间大- >小,等级大->小排序。。
接下来就是枚举,将所有满足机器运行时间》=任务时间的加入数组,然后选满足完成任务的最小等级的机器去完成任务。这样的巧妙之处在于后面的加进来的任务必定可以被先前加进来的机所完成。因为任务是按时间降序排列的。。那样这道题就得到了完美的解决。。
代码为:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100000+10;
int level[100+10];
int n,m,sum;
__int64 ans;
struct P
{
int xi,yi;
}machine[maxn],task[maxn];
bool cmp(P a,P b)
{
if(a.xi==b.xi) return a.yi>b.yi;
return a.xi>b.xi;
}
void read_data()
{
for(int i=1;i<=n;i++)
scanf("%d%d",&machine[i].xi,&machine[i].yi);
for(int i=1;i<=m;i++)
scanf("%d%d",&task[i].xi,&task[i].yi);
sort(task+1,task+1+m,cmp);
sort(machine+1,machine+1+n,cmp);
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
ans=sum=0;
read_data();
memset(level,0,sizeof(level));
for(int i=1,j=1;i<=m;i++)
{
while(j<=n&&machine[j].xi>=task[i].xi)
{
level[machine[j].yi]++;
j++;
}
for(int k=task[i].yi;k<=100;k++)
{
if(level[k])
{
level[k]--;
ans=ans+500*task[i].xi+2*task[i].yi;
sum++;
break;
}
}
}
printf("%d %I64d\n",sum,ans);
}
return 0;
}
hdu4864Task(贪心),布布扣,bubuko.com
标签:des style blog http java color os strong
原文地址:http://blog.csdn.net/u014303647/article/details/38092909