hdu4864

这是第一场多校的题目,当时是我在做,没出--。

检讨下,当时思路是对了的,用最大的任务,去匹配最小但刚好满足它的机器--,但是由于其他各种原因,写出的代码超时了。赛后想了下,比赛时for循环里面嵌套了个while循环,超时就在这里。其实是完全可以预处理的,我觉得是六月没a题,导致以往很多思路常识,都忘了----坑爹啊,于是改了下,将嵌套的for循环用队列预处理掉了....ac

题意:有n台机器,m台任务,每个任务和机器都有两个属性,一个是时间属性,一个是等级属性,只有当一台机器的两个属性都大于等于一个任务的两个属性时,才可以将这个任务完成。完成一个任务一颗得到的价值:时间*500+等级*2,题目是要求在完成最多的任务的情况下的最大价值。

思路:按时间从大到小排序,同时要是时间相等,则等级高的应该排在前面,由于只有100个等级,那么对等级开个队列queue<node>q[105],这样的话,每个队列里面第一个元素装的应该是对应的这个等级的最大时间的机器,第二个应该是次大的,并依次类推。然后用任务来匹配机器--。先是最大的任务,找到它所需要的最低等级,如果最低等级不能匹配它,则等级往上增加,直到找到一个与之匹配的,或者所有的机器都不能匹配它--。要是找到了一个与之匹配的机器,那么需要删掉这个机器--

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
typedef __int64 ss;
#define inf 100005
struct node
{
    ss a,b;
}s[inf],t[inf];
ss n,m;
queue<ss>q[105];
ss cmp(const node p,const node p1)
{
    if(p.a>p1.a)  return 1;
    else if(p.a==p1.a&&p.b>p1.b)
    return 1;
    else return 0;
}
int main()
{
    while(scanf("%I64d%I64d",&n,&m)>0)
    {
        for(ss i=0;i<=100;i++)
        {
            while(!q[i].empty())
            q[i].pop();
        }
        for(ss i=0;i<n;i++)
        {
            scanf("%I64d%I64d",&s[i].a,&s[i].b);

        }
        for(ss i=0;i<m;i++)
        {
            scanf("%I64d%I64d",&t[i].a,&t[i].b);
        }
        sort(s,s+n,cmp);
        sort(t,t+m,cmp);
        for(ss i=0;i<n;i++)
        {
            ss tmp=s[i].a,tmp1=s[i].b;
            q[tmp1].push(s[i].a);
        }
        ss k=0,ans=0;
        for(ss i=0;i<m;i++)
        {
            ss a=t[i].a;
            ss b=t[i].b;
            while(1)
            {
                if(b>100) break;
                while(q[b].size()==0&&b<=100)
                b++;
                if(b>100) break;
                ss tmp=q[b].front();
                if(tmp<a) b++;
                else break;
            }
            if(b>100) continue;
            k++;
            ans+=500*t[i].a+2*t[i].b;
            q[b].pop();
        }
        printf("%I64d %I64d\n",k,ans);
    }
    return 0;
}

  

hdu4864

时间: 2024-08-26 17:43:51

hdu4864的相关文章

HDU4864(Task)

题目地址:Task 题目大意: n台机器,m个任务,每台机器和任务都有两个值,机器的两个值都大于任务的两个值,这台机器才能完成这个任务,每台机器只能完成一个任务,问最大收益. 解题思路: 因为尽量处理时间大的任务,所以机器和任务先按时间从大到小排序,尽量找与task相接近的时间和等级,先将机器时间大于task1的所有机器按照机器的等级存入一个数组,然后按照task1的等级找最接近的处理机器,因为必须先处理时间高的任务,因为它需要乘500,一定很大,之所以找task1的等级找最接近,这样以保证后面

贪心——HDU4864

对应HDU题目:点击打开链接 Task Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3427    Accepted Submission(s): 887 Problem Description Today the company has m tasks to complete. The ith task need xi minut

[HDU4864]Task (贪心)

此图和上一篇博客的图一起看有奇效 题意 https://vjudge.net/problem/HDU-4864 思路 贪心 代码 by lyd 我实在是敲不来 #include <iostream> #include <cstdio> #include <cstring> #include <ctime> #include <algorithm> #include <cmath> #include <queue> #inc

hdu4864不是一般的贪心

题目表达的非常清楚,也不绕弯刚开始以为最大权匹配,仔细一想不对,这题的数据双循环建图都会爆,只能先贪心试一下,但一想贪心也要双循环啊,怎么搞? 想了好久没头绪,后来经学长提醒,可以把没用到的先记录下来嘛,以后就不用从头去找了,就像cache一样.我想了想就忽然开窍了,对啊,任务的价值只是一到一百而已,把先前遍历到的没用到的机器先记录下来,以后碰到合适的就不用再从头搜到尾了啊!这样外层100000里层100应该是能过的! 那么就用一个数组来标记机器的价值,cache[i]   表示价值i的机器有多

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

省赛训练赛(---)

A.HDU4968 最大gpa为从最大区间开始,每次取区间最小分数. 最小gap为从最小区间开始,每次取区间最大分数. #include<bits/stdc++.h> using namespace std; int ave,n; int x[10] = {0,85,80,75,70,60}; double xx[10] = {0,4,3.5,3,2.5,2}; int y[10] = {0,69,74,79,84,100}; double yy[10] = {0,2,2.5,3,3.5,4}

HDU 4864Task(多校联合训练1)(贪心)

题目地址:HDU4864 这题又是一上来认为是最小费用流,但是边太多,果然,敲完交上去后不断TLE..小优化了两次也没过...sad.. 后来看了题解才发现是贪心...贪心也不好想.大体思路是很好想的,就是先都按时间从大到小排序,再遍历任务,从机器里找能匹配的,并在能匹配的里边找等级尽量小的与之匹配.对我来说的突破点在于找能匹配的机器时不是每次都要重新找一遍,而是可以直接利用以前找到的.这就避免了n^2的复杂度.这样的时间复杂度就只有m*100,明显不会超时. 代码如下: #include <i

0x08 总结与练习

1:前面已经搞好了. 2:poj2965 这种开关问题一个点要么点一次要么不点,枚举所有点的方案实行即可 #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; char ss[10]; int main() { int d=0,tp=