zoukankan      html  css  js  c++  java
  • HDU 4864 Task(贪心或高斯消元)

    题意:n台机器工作时间为ai,等级bi,m个任务需要时间ai,等级bi,一台机器只能完成一个任务,完成一个任务收益为500*ai+2*bi,求最大收益;(n,m>100000)

    思路:先从大到小排时间,再从大到小排等级,借助等级数不超过100的条件,使用贪心以确保不超时:

            对于每个任务,在满足工作时间大于所需时间的条件下,统计对应等级的机器数量;

            当前统计的等级中的机器,一定能完成后面的任务;很巧妙的贪心;

           本题也可使用高斯消元实现:http://blog.csdn.net/a601025382s/article/details/38047905

           高斯消元入门:http://blog.csdn.net/tsaid/article/details/7329301

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int t,n,m;
    struct node
    {
        int x,y;
    }N[500010],M[500010];
    int cmp(node a,node b)
    {
        if(a.x==b.x) return a.y>b.y;
        return a.x>b.x;
    }
    int rk[500100];
    __int64 sum;
    int main()
    {
        int i,j,k,cnt;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            sum=0;cnt=0;
            memset(rk,0,sizeof(rk));
            for(i=0;i<n;i++)
                scanf("%d%d",&M[i].x,&M[i].y);
            sort(M,M+n,cmp);
            for(i=0;i<m;i++)
                scanf("%d%d",&N[i].x,&N[i].y);
            sort(N,N+m,cmp);
            for(i=0,j=0;i<m;i++)
            {
                while(j<n&&M[j].x>=N[i].x)
                {
                    rk[M[j].y]++;
                    j++;
                }
                for(k=N[i].y;k<=100;k++)
                {
                    if(rk[k])
                    {
                        rk[k]--;
                        cnt++;
                        sum+=(500*N[i].x+2*N[i].y);
                        break;
                    }
                }
            }
            printf("%d %I64d
    ",cnt,sum);
        }
        return 0;
    }
  • 相关阅读:
    django-rest-framework 注意事项
    Python virtualenv 使用总结篇
    python flask 基础入门
    python property
    python Numpy
    c语言学习的第四天2
    c语言学习第四天数据类型1
    学习c编程的第三天
    学习c编程的第二天
    HTTP首部及各状态码
  • 原文地址:https://www.cnblogs.com/dashuzhilin/p/4655171.html
Copyright © 2011-2022 走看看