HDU_4864 Task 贪心

今天多校的一道题,哎,多校被中学生碾压了

发现自己很怕敲贪心,这道题其实贪心特性相当明显,我看这个题算比较早,还在想各种递推或者dp那种

后来还是聪哥马上反应过来了

首先,对于任何的task,因为最后的money是 500*x+2*y,所以,在得到最多money方面,肯定是x的优先级高,x相同的时候再比较y

然后题目是要求 在保证最多任务完成量的前提下,money最多,在任务完成量方面,首先,题目一个很明显的说法是一个机器只能跟一个task对应,所以,一个task如果只是占用了刚好够自己用的机器,那绝对就是最优的,因为就算替换他,也就是1换1,没有任何区别,当然,如果他占用了比自己好很多的机器就可能有问题了,因为可能有更高级的任务会被排开,这样原本可能可以完成2件 就只能完成1件,所以,我们只要保证这个task是刚好满足这个机器,即可

于是,我们把task按照money最大的原则降序排序,把他们依次放到最适合他们的机器上(机器照同样的规则排完序,然后二分即可)。如果能放就放,不能放就扔了。根据上面的分析,这样求出来的结果必然是最优的。。而且在存在多种可能的情况下,因为我是按最大价值放的,得到的money也必定是最优的

在处理方面还有点小技巧,我一开始把所有机器全部存在一个vector里面,然后排序 一个个二分,满足条件的 在vector里面erase这个值,结果TLE了

首先要说一下 vector是线性结构,他的erase是擦除当前数,然后把后面的值一个个往前移,复杂度其实有点高,平均下来为On,如果用set就好多了,不仅自动排序,erase也是logN的。

还有题目有个隐含条件就是y最多只有100,那我完全可以开个V[110],分开存贮机器,然后在可能的区间里面再二分。。这样就快多了,最后也证明是这样过

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define LL __int64
using namespace std;
struct node
{
    int x,y;
}tasks[100010];
bool cmp(node a,node b)
{
    if (a.x==b.x) return a.y<b.y;
    return a.x<b.x;
}
int n,m;
vector<int> v[110];
int bs(int p,int q)
{
    int L=0,R=v[p].size(),mid;
    while (L<R)
    {
        mid=(L+R)>>1;
        if (v[p][mid]<tasks[q].x) L=mid+1;
        else R=mid;
    }
    return L;
}
int main()
{
    int a,b;
    while (scanf("%d%d",&m,&n)!=EOF)
    {
        int maxn=0;
        for (int i=0;i<110;i++) v[i].clear();
        for (int i=1;i<=m;i++){
            scanf("%d%d",&a,&b);
            v[b].push_back(a);
            maxn=max(b,maxn);
        }
        for (int i=1;i<=n;i++){
            scanf("%d%d",&a,&b);
            tasks[i].x=a;
            tasks[i].y=b;
        }
        sort(tasks+1,tasks+1+n,cmp);
        for (int i=0;i<=maxn;i++) sort(v[i].begin(),v[i].end());
        LL ans=0;
        int sum=0;
        for (int i=n;i>=1;i--){
            for (int j=tasks[i].y;j<=maxn;j++){
                int loc=bs(j,i);
                if (loc>=v[j].size()) continue;
                else{
                    v[j].erase(v[j].begin()+loc);
                    ans+=(LL)tasks[i].x*500+(LL)tasks[i].y*2;
                    sum++;
                    break;
                }
            }
        }
        printf("%d %I64d\n",sum,ans);
    }
    return 0;
}

  

HDU_4864 Task 贪心

时间: 2024-11-10 15:50:45

HDU_4864 Task 贪心的相关文章

hdu 4869 Task(贪心)

题目链接:hdu 4869 Task 题目大意:有n台机器,m个任务,每个机器和任务都有有xi和yi,要求机器的xi,yi均大于等于任务的xi和yi才能执行任务.每台机器一天只能执行一个任务.要求完成的任务数尽量多,并且说金额尽量大.完成每个任务的金额为xi?500+yi?2 解题思路:贪心,mach[i][j]表示等级为i,时间为j的机器数量,task[i][j]表示等级为i,时间为j的机器数量.每次优先减少i,因为对应等级减少100,对应的金额代价也不会减少超过500(即时间减少1). 每次

HDU 4864 Task(贪心)

HDU 4864 Task 题目链接 题意:有一些机器和一些任务,都有时间和等级,机器能做任务的条件为时间等级都大于等于任务,并且一个任务只能被一个机器做,现在求最大能完成任务,并且保证金钱尽量多 思路:贪心,对于每个任务,时间大的优先去匹配,时间相同的,等级大的优先去匹配,因为时间占得多,时间多1就多500,而等级最多才差200.然后匹配的时候,尽量使用等级小的去匹配,而时间只要大于它的都可以用,因为是按时间优先,所以如果该时间能匹配大的,其他肯定也能匹配,那么肯定优先匹配大的,所以只要在等级

Codeforces 583 DIV2 Robot&#39;s Task 贪心

原题链接:http://codeforces.com/problemset/problem/583/B 题意: 就..要打开一个电脑,必须至少先打开其他若干电脑,每次转向有个花费,让你设计一个序列,使得总花费最小. 题解: 就傻傻的走就好..从左走到右,再走回来,更新序列和答案就好. 代码: #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #define MA

2014多校第一场D题 || HDU 4864 Task (贪心)

题目链接 题意 : 用N台机器,M个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于任务的等级.一台机器只能完成一个任务,一个任务只能被一台机器完成.每个机器完成一个任务公司能够获得500*xi+2*yi (此处xy都是指被完成的任务的).输出所有机器能完成的最多任务数,和最大盈利. 思路 :贪心,自己做的时候想了各种排序都不对,没有考虑到500*xi+2*yi 这个公式的重要性.

HDU 4864 Task (贪心+STL多集(二分)+邻接表存储)(杭电多校训练赛第一场1004)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864 解题报告:有n台机器用来完成m个任务,每个任务有一个难度值和一个需要完成的时间,每台机器有一个可以工作的最长时间和一个可以完成的任务的难度的最大值, 一台机器能完成一个任务的条件是这台机器的最长工作时间和能完成任务的难度值必须都大于等于这个任务,而且一台机器最多完成一个任务,假设一个任务的时间为t,难度值为x,那么完成这个任务可以赚到的钱 money = 500 * t + 2 * x; 现在

hdu 4864 Task (贪心 技巧)

题目链接 一道很有技巧的贪心题目. 题意:有n个机器,m个任务.每个机器至多能完成一个任务.对于每个机器,有一个最大运行时间xi和等级yi, 对于每个任务,也有一个运行时间xj和等级yj.只有当xi>=xj且yi>=yj的时候,机器i才能完成任务j,并获得 500*xj+2*yj金钱.问最多能完成几个任务,当出现多种情况时,输出获得金钱最多的情况. 分析:机器和任务都按照先拍x从大到小,再拍y从大到小的顺序.然后遍历任务,注意f[]数组的作用,f[]数组标 记大于当前任务时间的机器的等级个数,

HDU 4864 Task 贪心 好题

Task Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4103    Accepted Submission(s): 1077 Problem Description Today the company has m tasks to complete. The ith task need xi minutes to complete.

HDU4864:Task(贪心)

Problem Description Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this task has a difficulty level yi. The machine whose level below this task's level yi cannot complete this task. If the company comp

2014多校联盟 第一场 Task 贪心

问题 D: Task 题目描述 Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this task has a difficulty level yi. The machine whose level below this task’s level yi cannot complete this task. If the company complete