HDU 4864 Task (貪心)
Task
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2154 Accepted Submission(s): 549
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 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
Sample Output 1 50004 題意:
題目中告訴我們有n臺機器和m個任務,每一臺機器一天可以解決一個任務,一個任務一天也僅能由一臺機器完成。對於它們之間的關係必須滿足機器的執行時間比任務的工作時間長,以及機器的工作等級比任務的工作等級高。思路:
當完成一個任務時,就可以得到 “500 * 任務時間 + 2 * 任務等級” 的金錢,問最多能完成多少任務同時得到最多的金錢。
首先這裡的機器和任務是一對一的匹配,為了取得最多的金錢考慮到先去解決可以盈利較多的任務,那麼這裡就對任務和機器進行排序,採取先大後小的策略,由於任務時間佔的權重較大(500 : 2),所以優先排序時間後排序等級。
對於每一個任務,每次取到最優的機器去做該任務。若採用全部重新遍歷機器的方式,必定會超時(N * M)。
考慮到能完成前面任務(時間長,等級高的任務)的機器對於時間方面一定能達到要求。所以將這些能完成前面任務的機器全部標記下來,然後從中找出等級最小且滿足等級要求的機器去完成任務。
/*************************************************************************
> File Name: hdu4864.cpp
> Author: Bslin
> Mail: [email protected]
> Created Time: 2014年07月23日 星期三 18時40分14秒
************************************************************************/
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100010
struct node {
int time, level;
bool operator < (const node &b) const {
if(time == b.time) {
return level > b.level;
}
return time > b.time;
}
} mach[N], task[N];
int vis[110];
int main(int argc, char *argv[]) {
freopen("in.txt", "r", stdin);
int n, m, i, j, k;
long long ans, num;
while(scanf("%d%d", &n, &m) != EOF) {
for (i = 0; i < n; ++i) {
scanf("%d%d", &mach[i].time, &mach[i].level);
}
for (i = 0; i < m; ++i) {
scanf("%d%d", &task[i].time, &task[i].level);
}
sort(mach, mach + n);
sort(task, task + m);
memset(vis, 0, sizeof(vis));
ans = 0;
num = 0;
for (i = 0, j = 0; i < m; ++i) {
while(j < n && mach[j].time >= task[i].time) {
vis[mach[j].level] ++;
j ++;
}
for (k = task[i].level; k <= 100; ++k) {
if(vis[k]) {
num ++;
vis[k] --;
ans += 500 * task[i].time + 2 * task[i].level;
break;
}
}
}
printf("%I64d %I64d\n", num, ans);
}
return 0;
}
相關推薦
HDU 4864 Task(貪心) (機器完成目標任務, 兩個權值, 小範圍打表)
Task Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7171 Accepted Submiss
hdu 4864 Task 貪心
題意:有n個機器,m個任務。每個機器至多能完成一個任務。對於每個機器,有一個最大執行時間xi和等級yi,對於每個任務,也有一個執行時間xj和等級yj。只有當xi>=xj且yi>=yj的時候,機器i才能完成任務j,並獲得500*xj+2*yj金錢。問最多能完成幾個
HDU 4864 Task (貪心)
Task Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2154 Accepted Submission(
HDU 4864 Task(2014多校第一場1004)(貪心)
題意:有n個機器和m個測試,只有機器的time和level都不小於測試的time和level才能通過測試,一個機器只能對應一個測試,一個測試只能對應一個機器。每通過一個測試可以得到金錢數:500*t
HDU 4864 Task(基本演算法-貪心)
Task Problem Description Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this task ha
HDU 4864 Task(經典貪心)
傳送門: Task Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11382 Accepted Submission(s): 2782 Pr
HDU 4864 Task (2014多校聯合訓練第一場1004) 解題報告(貪心)
Task Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 400 Accepted Submission(
HDU 4864 Task
題意: 每臺機器有x,y兩種屬性,有m個任務,如果機器的這兩個屬性大於任務,那麼就是可以完成這個任務,並且每個任務每隻能完成一個任務。 思路:先按照x排序,x相等,按照y排序,每一次記錄下來可以完成這
【HDU 4864】 Task
name names php def target nbsp set In print 【題目鏈接】 http://acm.hdu.edu.cn/showproblem.php?pid=4864 【算法】 貪心
HDU 4864 貪心
要求:有n臺機器和m個任務,並且每臺機器和每個任務都帶有一個時間標記和一個等級標記,只有機器的兩個標記都大於任務時才能進行該任務。最大等級不超過100,完成一個任務獲得錢數為500*時間+2*等級。一臺機器一天只能完成一個任務,求完成最大任務數,若有多解,取賺錢數最多的。 方法
HDU--4486 Task(貪心)
main 一個 一個數 pid sca 個數 lan efi scan 題目鏈接 4486 Task 按照時間從大到小排序 然後枚舉所有的y值 用一個數組存儲 符合要求就算上 #include<bits/stdc++.h> using namespa
貪心 之 hdu 4864
// [7/23/2014 Sjm] /* 又坑在TLE上了。。。。 Each machine can only complete a task one day. Each task can only be completed by one machine.所以想到了貪心
[BestCoder Round #3] hdu 4907 Task schedule (模擬簡單題)
using mes family set key problem 占用 時間 task Task schedule Problem Description 有一臺機器,而且給你這臺機器的工作表。工作表上有n個任務,機器在ti時間運行第i個任務,1秒就可以完畢
HDU 3572 Task Schedule(ISAP模板&&最大流問題)
reat avi 所有 dsm name col eof 網絡流 -1 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3572 題意:m臺機器。須要做n個任務。第i個任務。你須要使用機器Pi天,且這個任務要在[Si
2017多校第10場 HDU 6180 Schedule 貪心,multiset
ble n) long long nbsp typedef 一個 sched int esp 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6180 題意:給了一些任務的開始時間和終止時間,現在讓我們安排k臺及機器,讓這些任務
hdu 3572 Task Schedule
cout stdio.h res geometry stdin i++ rst math.h pro Task Schedule Problem Description Our geometry princess XMM has stoped her study in co
HDU - 3572-Task Schedule
amp 結束時間 view can 分享 sed 不同 node printf 題目大意:給N個任務,M臺機器。每個任務有最早才能開始做的時間S,最晚完成時間 E, 和持續工作的時間P。每個任務可以由不同的機器進行,但是在同一時刻,一臺機器最多只能 執行一個任務. 問存不存
HDU 5281【貪心】
\n clu define AC n) string for eve typedef 用最牛逼的槍打最弱的怪物,先給槍和怪物排個序。 #include <iostream> #include <queue> #include <algorith
HDU 3979【貪心】
時有 print %d algorithm void string time urn LG 這題剛開始想當然的直接按g值排序了。 正確做法是,由於要失去的血量最小,則若此時有兩個monster A,B 先A後B失去的血量為 (timeA+timeB)gB+timeAgA 先
hdu-3572 Task Schedule---最大流判斷滿流+dinic算法
push_back size 分段 amp con AS mda tro iter 題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=3572 題目大意: 給N個任務,M臺機器。每個任務有最早才能開始做的時間S,deadline