• HDOJ4864 Task 题解报告


    题目传送门

    【题目大意】

    有$m$个任务,第$i$个任务等级为$y_i$,完成任务需要的时间为$x_i$,收益为$500*x_i+2*y_i$。有$n$台机器,第$i$台机器的等级为$y_i$,最长工作时间为$x_i$,如果任务等级高于机器等级或是任务时间大于机器工作时间,则不能用该机器完成该任务。一台机器只能完成一个任务,一个任务也只能在一台机器上完成,求最多可以完成多少个任务并求出最大收益。

    【思路分析】

    这题的贪心虽然很明显,但有点难想,因为时间在收益中所占的比重更大,所以考虑以时间为第一关键字,等级为第二关键字分别给任务和机器从大到小排序。然后枚举每个任务,记录每个满足时间条件的机器,再从小到大查找满足等级条件的机器并计算收益。

    【代码实现】

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #define rg register
     6 #define go(i,a,b) for(rg int i=a;i<=b;i++)
     7 #define ll long long
     8 using namespace std;
     9 const int N=100002;
    10 int n,m,num[102],ans1;
    11 ll ans2;
    12 struct machine{
    13     int x,y;
    14 }a[N],b[N];
    15 bool cmp(machine A,machine B){
    16     if(A.x!=B.x) return A.x>B.x;
    17     return A.y>B.y;
    18 }
    19 int main(){
    20     while(scanf("%d%d",&n,&m)!=EOF){
    21         go(i,1,n) scanf("%d%d",&a[i].x,&a[i].y);
    22         go(i,1,m) scanf("%d%d",&b[i].x,&b[i].y);
    23         sort(a+1,a+1+n,cmp);sort(b+1,b+1+m,cmp);
    24         int j=1;
    25         go(i,1,m){
    26             while(j<=n&&a[j].x>=b[i].x) num[a[j].y]++,j++;
    27             //记录满足时间条件的机器
    28             go(k,b[i].y,100)
    29                 if(num[k]){//查找满足等级条件的机器
    30                     num[k]--;ans1++;ans2+=500*b[i].x+2*b[i].y;
    31                     break;
    32                 }
    33         }
    34         printf("%d %lld
    ",ans1,ans2);
    35         ans1=ans2=0;memset(num,0,sizeof(num));
    36     }
    37     return 0;
    38 }
    代码戳这里
  • 相关阅读:
    动态加载js文件以支持跨域脚本
    获取页面宽高的一些代码
    根据dom对象或其id获取对象位置的代码
    Exchange2007用户用户全部访问权限授权命令及验证脚本
    frame页面地址转向跨域解决方法
    过滤掉多余的重复记录的SQL语句
    读写cookie的方法
    识别移动设备脚本
    winrar打包部署程序
    自己动手搭建MinGW
  • 原文地址:https://www.cnblogs.com/THWZF/p/11272747.html
Copyright © 2020-2023  润新知