HDU 4864 Task 多校第一场1004 multiset

来源:互联网 发布:网络文明传播志愿评论 编辑:程序博客网 时间:2024/06/15 04:04


题目链接: 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;}


0 0
原创粉丝点击