2014 Multi-University Training Contest 1 - 1004 / hdu 4864 Task

Task

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1988    Accepted Submission(s): 514


Problem Description
Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this task has a difficulty level yi. The machine whose level below this task’s level yi cannot complete this task. If the company completes this task, they will get (500*xi+2*yi) dollars.
The company has n machines. Each machine has a maximum working time and a level. If the time for the task is more than the maximum working time of the machine, the machine can not complete this task. Each machine can only complete a task one day. Each task can only be completed by one machine.
The company hopes to maximize the number of the tasks which they can complete today. If there are multiple solutions, they hopes to make the money maximum.
 

Input
The input contains several test cases.
The first line contains two integers N and M. N is the number of the machines.M is the number of tasks(1 < =N <= 100000,1<=M<=100000).
The following N lines each contains two integers xi(0<xi<1440),yi(0=<yi<=100).xi is the maximum time the machine can work.yi is the level of the machine.
The following M lines each contains two integers xi(0<xi<1440),yi(0=<yi<=100).xi is the time we need to complete the task.yi is the level of the task.
 

Output
For each test case, output two integers, the maximum number of the tasks which the company can complete today and the money they will get.
 

Sample Input
1 2 100 3 100 2 100 1
 

Sample Output
1 50004
 

Author
FZU
 

Source
 

Recommend
We have carefully selected several similar problems for you:  4871 4870 4869 4868 4867 

官方題解:

D. Task

基本思想是貪心。

對於價值c=500*xi+2*yiyi最大影響100*2<500,所以就是求xi總和最大。可以先對機器和任務的時間從大到小排序。從最大時間的任務開始,找出滿足任務時間要求的所有機器,從中找出等級最低且滿足任務等級要求的機器匹配。依次對任務尋找滿足要求的機器。


這是多校裏邊憋了半天也沒出的一道題,結果發現和自己的想法很相似,大牛的代碼看起來很簡單,爲毛自己做不到呢,加油啦!!!
其實代碼很好懂,在mulitiset二分查找匹配機器,而任務是用線性的遍歷就夠了:

 
/*
Problem : 4864 ( Task )     Judge Status : Accepted
RunId : 11153650    Language : G++    Author : motefly
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
using namespace std;
const int maxn=100005;
pair<int,int>ma[maxn],ta[maxn];
multiset<int > s;
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        s.clear();
        for(int i=0;i<n;i++)
            scanf("%d%d",&ma[i].first,&ma[i].second);
        for(int i=0;i<m;i++)
            scanf("%d%d",&ta[i].first,&ta[i].second);
        sort(ma,ma+n,greater< pair<int,int> > ());
        sort(ta,ta+m,greater< pair<int,int> > ());
        int cnt=0;
        long long ans=0;
        for(int i=0,j=0;i<m;i++)
        {
            while(j<n&&ma[j].first>=ta[i].first)
                s.insert(ma[j++].second);
            multiset<int>::iterator it=s.lower_bound(ta[i].second);
            if(it!=s.end())
            {
                ++cnt;
                ans+=500*ta[i].first+2*ta[i].second;
                s.erase(it);
            }
        }
        cout<<cnt<<' '<<ans<<endl;
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章