标签:des style blog http java color
1 2 100 3 100 2 100 1
1 50004
题解:比赛的时候,看了看过的队伍很多,但是正确率却很低,自己也没出这道题。比赛后看了题解才做出来的。
题解的意思就是----每完成一件任务,获得利润=500*t+2*w,这里w的范围是1-100,最大值W=200<500对于整体利润的影响很小,所以对任务和时间均按照t递减排序,t相同按照w递减排序。然后从第一件任务开始遍历,找出所有能够解决这项任务的机器,并挑出工作时间最少,并且等级最低的那台来完成这项任务,以此类推,直到所有任务都完成。
为什么要这样安排呢?任务排序之后,后边的任务的一部分是时间与当前任务时间相同,但任务等级低的,能过解决当前任务的机器比人能够完成剩下的任务;另外一部分是时间比当前任务短,任务等级比当前任务高的,假设我挑走一台等级高机器,这台机器能完成这两项任务,另外存在一台机器等级低的机器只能完成当前任务,如果我用等级高的那台来完成当前任务的话,后来的任务就不能完成了,所以我要选择等级低但是能完成当前任务的那台机器;第三种情况,时间短,任务等级低的,能够完成当前任务的那些机器必然能用来完成这些任务。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef __int64 LL;
struct node{
int x,y;
}l[100010],r[100010];
bool cmp(node a,node b)
{
if(a.x!=b.x)
return a.x>b.x;
return a.y>b.y;
}
int main()
{
int m,n;
while(scanf("%d%d",&m,&n)!=EOF)
{
for(int i=0;i<m;i++)
scanf("%d%d",&l[i].x,&l[i].y);
for(int j=0;j<n;j++)
scanf("%d%d",&r[j].x,&r[j].y);
sort(l,l+m,cmp);
sort(r,r+n,cmp);
LL ans=0,num=0;
int c[110],i,j;
memset(c,0,sizeof(c));
for(i=0,j=0;i<n;i++)
{
while(j<m&&l[j].x>=r[i].x)
{
c[l[j].y]++;
j++;
}
for(int k=r[i].y;k<=100;k++)
{
if(c[k])
{
c[k]--;
num++;
ans+=500*r[i].x+2*r[i].y;
break;
}
}
}
printf("%I64d %I64d\n",num,ans);
}
return 0;
}
标签:des style blog http java color
原文地址:http://blog.csdn.net/knight_kaka/article/details/38068267