题目链接: Click here
题目就是给出机器能运行的时间与难度,以及任务的时间及难度
Each machine can only complete a task one day. Each task can only be completed by one machine.
这句话一定要看到。。
然后看到数据量 xi(0<xi<1440),yi(0=<yi<=100)
= =这是突破口。。
之后只要对每个任务,找到难度大于它的最小的机器就好了。 从1440开始倒推,没用完的机器放到下一个时间点接着找。。
纯当练习STL吧。。
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
multiset<int> machine[1444];
vector<int> task[1444];
int n,m;
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
for(int i = 1;i <= 1441;i++)task[i].clear(),machine[i].clear();
int maxt = 0;
for(int i = 1,u,v;i <= n;i++){
scanf("%d %d",&u,&v);
machine[u].insert(v);
maxt = max(u,maxt);
}
for(int i = 1,u,v;i <= m;i++){
scanf("%d %d",&u,&v);
task[u].push_back(v);
}
for(int i = 1;i <= 1440;i++){
sort(task[i].begin(), task[i].end());
}
int cnum = 0;
long long ans = 0;
for(int i = maxt;i > 0;i--){
machine[i].insert(machine[i+1].begin(),machine[i+1].end());
machine[i+1].clear();
if(!task[i].empty()){
for(int j = task[i].size()-1; j >= 0;j--){
int y = task[i][j];
multiset<int>::iterator it = machine[i].lower_bound(y);
if(it!=machine[i].end()){
cnum++;
ans += 500 * i + 2*y;
machine[i].erase(it);
}
}
}
}
cout << cnum <<" "<< ans << endl;
}
return 0;
}