hdu 4864 Task

http://acm.hdu.edu.cn/showproblem.php?pid=4864

对机器和任务先按时间从大到小排序,时间相同再水平。先选任务找到最小的符合的机器贪心处理就行。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <algorithm>

 4 #define maxn 200000

 5 using namespace std;

 6 

 7 struct node

 8 {

 9     int ti,le;

10     bool operator <(const node &a)const

11     {

12         return (ti>a.ti)||(a.ti==ti&&le>a.le);

13     }

14 }m[maxn],t[maxn];

15 

16 int n,m1;

17 int c[maxn];

18 

19 int main()

20 {

21     while(scanf("%d%d",&n,&m1)!=EOF)

22     {

23         memset(c,0,sizeof(c));

24         for(int i=0; i<n; i++)

25         {

26             scanf("%d%d",&m[i].ti,&m[i].le);

27         }

28         for(int i=0; i<m1; i++)

29         {

30             scanf("%d%d",&t[i].ti,&t[i].le);

31         }

32         sort(m,m+n);

33         sort(t,t+m1);

34         __int64 sum=0;

35         int j=0;

36         int ans=0;

37         for(int i=0; i<m1; i++)

38         {

39             while(j<n&&m[j].ti>=t[i].ti)

40             {

41                 c[m[j].le]++;

42                 j++;

43             }

44             for(int k=t[i].le; k<=200; k++)

45             {

46                 if(c[k])

47                 {

48                     c[k]--;

49                     ans++;

50                     sum+=(500*t[i].ti+2*t[i].le);

51                     break;

52                 }

53             }

54         }

55         printf("%d %I64d\n",ans,sum);

56     }

57     return 0;

58 }
View Code

你可能感兴趣的:(task)