题目地址:Task
题目大意:
n台机器,m个任务,每台机器和任务都有两个值,机器的两个值都大于任务的两个值,这台机器才能完成这个任务,每台机器只能完成一个任务,问最大收益。
解题思路:
因为尽量处理时间大的任务,所以机器和任务先按时间从大到小排序,尽量找与task相接近的时间和等级,先将机器时间大于task1的所有机器按照机器的等级存入一个数组,然后按照task1的等级找最接近的处理机器,因为必须先处理时间高的任务,因为它需要乘500,一定很大,之所以找task1的等级找最接近,这样以保证后面taskn等级大的任务不受影响完成,依次类推。
代码:
1 /* 2 题意:n台机器,m个任务,每台机器和任务都有两个值,机器的两个值都大于任务的两个值, 3 这台机器才能完成这个任务,每台机器只能完成一个任务,问最大收益 4 思路:因为尽量处理时间大的任务,所以机器和任务先按时间从大到小排序,尽量找与task相接近的时间和等级, 5 先将机器时间大于task1的所有机器按照机器的等级存入一个数组,然后按照task1的等级 6 找最接近的处理机器,因为必须先处理时间高的任务,因为它需要乘500,一定很大,之所以找task1的等级 7 找最接近,这样以保证后面taskn等级大的任务不受影响完成,依次类推。 8 */ 9 10 /*网上的代码:*/ 11 #include <stdio.h> 12 #include <string.h> 13 #include <algorithm> 14 using namespace std; 15 16 struct node 17 { 18 int x,y; 19 } s1[100005],s2[100005]; 20 21 int cmp(node a,node b) 22 { 23 if(a.x == b.x) 24 return a.y>b.y; 25 return a.x>b.x; 26 } 27 28 int main() 29 { 30 int n,m,i,j,cnt; 31 __int64 sum; 32 while(~scanf("%d%d",&n,&m)) 33 { 34 for(i = 0; i<n; i++) 35 scanf("%d%d",&s1[i].x,&s1[i].y); 36 for(i = 0; i<m; i++) 37 scanf("%d%d",&s2[i].x,&s2[i].y); 38 sort(s1,s1+n,cmp); 39 sort(s2,s2+m,cmp); 40 cnt = sum = 0; 41 int c[105] = {0}; 42 for(i = 0,j = 0; i<m; i++) 43 { 44 while(j<n && s1[j].x>=s2[i].x) 45 { 46 c[s1[j].y]++; 47 j++; 48 } 49 for(int k = s2[i].y; k<=100; k++) 50 { 51 if(c[k]) 52 { 53 c[k]--; 54 sum+=(s2[i].x*500+s2[i].y*2); 55 cnt++; 56 break; 57 } 58 } 59 } 60 printf("%d %I64d ",cnt,sum); 61 } 62 }