zoukankan      html  css  js  c++  java
  • hdu 4864 task 贪心

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

    【题意】 有n个机器每个机器都有一个最长工作时间和等级,m个任务,每个任务有一个需要花费的时间和任务等级,每个任务完成了可以得打到500*time+2*rank 块钱,一个机器只能对应做一个时间和等级都

               小于等于的它自己的任务,求可以得到的最多的钱。

    【思路】因为等级最大为100,100*2<500,对钱数等级影响的主要是time,对机器和任务对时间由大到小排序,时间最大的任务开始,找到时间符合的等级最小的机器。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<queue>
     5 #include<cmath>
     6 #include<algorithm>
     7 using namespace std;
     8 queue<int > q[102];
     9 struct node{int t,r;}machine[100002],task[100002];
    10 int cmp(node a,node b)
    11 {
    12     if(a.t==b.t)
    13         return  a.r>b.r;
    14     return a.t>b.t;
    15 }
    16 
    17 int main()
    18 {
    19     int n,m;
    20     while(~scanf("%d%d",&n,&m))
    21     {
    22         int ans1=0;
    23         __int64 ans2=0;
    24         for(int i=0;i<n;i++)
    25             scanf("%d%d",&machine[i].t,&machine[i].r);
    26         for(int i=0;i<m;i++)
    27             scanf("%d%d",&task[i].t,&task[i].r);
    28         sort(machine,machine+n,cmp);
    29         sort(task,task+m,cmp);
    30         int i=0,j=0;//i任务   j 机器
    31 
    32         for(int i=0;i<100;i++)
    33         while(!q[i].empty())
    34           q[i].pop();
    35 
    36         for(int i=0;i<n;i++)//  同一级的机器入队
    37             q[machine[i].r].push(i);
    38 
    39         for(int i=0;i<m;i++)
    40         {
    41             int time,rank1;
    42             time=task[i].t; rank1=task[i].r;//zhao ji qi
    43             while(1)
    44             {
    45                 while(q[rank1].size()==0&&rank1<100)
    46                     rank1++;
    47                 if(rank1>=100)
    48                     break;
    49                 int temp=q[rank1].front();
    50                 if(machine[temp].t>=time)    // 队列的第一个是这个等级时间最大的机器,第一个时间符合的就直接匹配,因为下一个任务的时间肯定等于或者小于此任务。
    51                 {
    52                     ans1++;
    53                     ans2+=task[i].t*500+task[i].r*2;
    54                     q[rank1].pop();
    55                     break;
    56                 }
    57                 else rank1++;
    58             }
    59         }
    60         printf("%d %I64d
    ",ans1,ans2);
    61     }
    62     return 0;
    63 }
  • 相关阅读:
    IdentityServer4学习笔记
    常用链接地址
    c++ 多线程(2000个)端口扫描(附源码)
    C++ 定时器Timer在项目中的使用
    [Under the hood]---Matt Pietrek October 1996 MSJ
    [under the hood]Reduce EXE and DLL Size with LIBCTINY.LIB
    TN035: Using Multiple Resource Files and Header Files with Visual C++
    单文件版本的netframework的net core 2.1
    Dependency Walker的替代品Dependencies
    怎么使用gradle给spring 打thinjar(gradle 7)
  • 原文地址:https://www.cnblogs.com/assult/p/3863216.html
Copyright © 2011-2022 走看看