题目地址:​​点击打开链接​

思路:不能为机器选任务,要为任务选机机器,不要浪费机器的时间和等级

AC代码:

#include <iostream>
#include<algorithm>
#include<cstring>

using namespace std;

struct node
{
int time;
int level;
}a[100010],b[100010];
bool cmp(struct node x,struct node y)//里面的struct去掉也可
{
if(x.time != y.time)
return x.time > y.time;
else
return x.level > y.level;
}
int main()
{
__int64 sum;
int n,m,sum1;
int i,j,k;
int c[120];
while(cin>>n>>m)
{
sum = 0;
sum1 = 0;
for(i=1; i<=n; i++)
{
cin>>a[i].time>>a[i].level;
}
for(i=1; i<=m; i++)
{
cin>>b[i].time>>b[i].level;
}
sort(a+1,a+n+1,cmp);//注意都得加1,因为下标是从0开始的
sort(b+1,b+m+1,cmp);
j=1;
memset(c,0,sizeof(c));
for(i=1; i<=m; i++)
{
while(j<=n && a[j].time >= b[i].time)
{
c[a[j].level]++;
j++;
}
for(k=b[i].level; k<=100; k++)
{
if(c[k])
{
c[k]--;
sum += (b[i].time * 500 + b[i].level * 2);
sum1++;
break;
}
}
}
cout<<sum1<<" "<<sum<<endl;
}
return 0;
}

我测试这个代码的数据是

2 2

100 5

90 5

90 5

120 5

我又找一位大神的代码测试我的数据,结果输出的是45010,

大神AC代码:

#include<cstdio>
#include<string.h>
#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
#define MAX 100005
using namespace std;
int n,m;
map<int,int> mapp;
struct machine
{
int minute,level;
}mach[MAX];
struct Task
{
int minute,level;
}task[MAX];

int cmp(Task a,Task b)
{
if(a.minute==b.minute)
return a.level>b.level;
return a.minute>b.minute;
}
int cnp(machine a,machine b)
{
if(a.minute==b.minute)
return a.level>b.level;
return a.minute>b.minute;
}
int main()
{
__int64 money;
int cnt,i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
money=0;
cnt=0;
for(i=0;i<n;i++)
scanf("%d%d",&mach[i].minute,&mach[i].level);
for(i=0;i<m;i++)
scanf("%d%d",&task[i].minute,&task[i].level);
sort(task,task+m,cmp);
sort(mach,mach+n,cnp);
mapp.clear();
j=0,cnt=0,money=0;
for(i=0;i<m;i++)
{
while(j<n&&mach[j].minute>=task[i].minute)
{
mapp[mach[j].level]++; //把满足时间要求的所有机器选出来
j++;
}
map<int,int>::iterator it=mapp.lower_bound(task[i].level); //二分查找
if(it!=mapp.end())
{
cnt++;
money+=(task[i].minute*500)+task[i].level*2;
int t=it->first;
mapp[t]--; //删除对应的机器,用STL的优势就体现在这里啦
if(mapp[t]==0) //不影响整体
mapp.erase(t);
}
}
printf("%d %I64d\n",cnt,money);
}
}