bestcoder#3——Task schedule

Task schedule

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 0    Accepted Submission(s): 0

Problem Description

有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务。有m个询问,每个询问有一个数字q,表示如果在q时间有一个工作表之外的任务请求,请计算何时这个任务才能被执行。机器总是按照工作表执行,当机器空闲时立即执行工作表之外的任务请求。

Input

输入的第一行包含一个整数T, 表示一共有T组测试数据。

对于每组测试数据:第一行是两个数字n, m,表示工作表里面有n个任务, 有m个询问;第二行是n个不同的数字t1, t2, t3....tn,表示机器在ti时间执行第i个任务。接下来m行,每一行有一个数字q,表示在q时间有一个工作表之外的任务请求。

特别提醒:m个询问之间是无关的。

[Technical Specification]1. T <= 502. 1 <= n, m <= 10^53. 1 <= ti <= 2*10^5, 1 <= i <= n4. 1 <= q <= 2*10^5

Output

对于每一个询问,请计算并输出该任务何时才能被执行,每个询问输出一行。

Sample Input

1
5 5
1 2 3 5 6
1
2
3
4
5

Sample Output

4
4
4
4
7

AC:用模拟+优先队列 做的又费事又费力还耗内存- =伤不起  (水题)。

//author: svtter
//

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <map>
#include <algorithm>
#include <queue>
#include <cmath>

#define INF 0xffffff
#define lln long long

using namespace std;

struct item
{
    int n;
    int i;
    bool operator < (const item &a)const
    {
        return n > a.n;
    }
};

int m, n;
int work[100001];
int extra[100001];
priority_queue <item> q;

int main()
{
    int i, cur;
    int t;
    int t1;
    int a;
    item it, b;
    freopen("test2", "r", stdin);
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d%d", &n, &m);
        for(i = 0; i < n; i++)
            scanf("%d", &work[i]);
        for(i = 0; i < m; i++)
        {
            scanf("%d", &it.n);
            it.i = i;
            q.push(it);
        }
        sort(work, work+n);
        t1 = 0;
        cur = 0;
        while(!q.empty())
        {
            if(t1 != n)
                a = work[t1];
            else
            {
                while(!q.empty())
                {
                    b = q.top();
                    if(b.n <= cur)
                        extra[b.i] = cur;
                    else
                    {
                        extra[b.i] = b.n;
                    }
                    q.pop();
                }
                break;
            }
            if(!q.empty())
                b = q.top();
            else
                break;

            if(a > b.n && a != cur)
            {
                if(b.i <= cur)
                    extra[b.i] = cur;
                else
                    extra[b.i] = b.n;
                q.pop();
            }
            else
            {
                cur = work[t1]+1;
                t1++;
            }
        }

        for(i = 0; i < m; i++)
            printf("%d\n", extra[i]);
        printf("\n");
    }
    return 0;
}

bestcoder#3——Task schedule,布布扣,bubuko.com

时间: 2024-10-16 15:59:32

bestcoder#3——Task schedule的相关文章

[BestCoder Round #3] hdu 4907 Task schedule (模拟简单题)

Task schedule Problem Description 有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务. 有m个询问,每个询问有一个数字q,表示如果在q时间有一个工作表之外的任务请求,请计算何时这个任务才能被执行. 机器总是按照工作表执行,当机器空闲时立即执行工作表之外的任务请求. Input 输入的第一行包含一个整数T, 表示一共有T组测试数据. 对于每组测试数据: 第一行是两个数字n, m,表示工作表里面有n个任务,

BestCoder Round #3 1001 &amp;&amp; HDU 4907 Task schedule (预处理)

题目链接:HDU 4907 Task schedule 中文题. 思路:将工作表存在vis的组数中.预处理一遍.具体看代码 AC代码: #include<stdio.h> #include<string.h> bool vis[200100]; int tak[200100]; int main() { int j,i,ti; int n,m,t,num; while(scanf("%d",&t)!=EOF) { while(t--) { memset(

BestCoder Round #3 A hdu 4907 Task schedule

Task schedule                                                                        Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 307    Accepted Submission(s): 160 Problem Description 有一台机器

HDU4907——Task schedule(BestCoder Round #3)

Task schedule Description有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务.有m个询问,每个询问有一个数字q,表示如果在q时间有一个工作表之外的任务请求,请计算何时这个任务才能被执行.机器总是按照工作表执行,当机器空闲时立即执行工作表之外的任务请求.Input输入的第一行包含一个整数T, 表示一共有T组测试数据.对于每组测试数据:第一行是两个数字n, m,表示工作表里面有n个任务, 有m个询问:第二行是n个不同的

hdu 4907 Task schedule(哈希运用)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4907 Task schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 554    Accepted Submission(s): 275 Problem Description 有一台机器,并且给你这台机器的工作表,工作表上有

hdu 3572 Task Schedule

Task Schedule Problem Description Our geometry princess XMM has stoped her study in computational geometry to concentrate on her newly opened factory. Her factory has introduced M new machines in order to process the coming N tasks. For the i-th task

Task Schedule(Hdu3572网络流)

跟着风神学图论 Task Schedule(Hdu3572网络流) 题意: 有一个工厂最近新近了一批机器人,这些机器人被用来解决若干个任务.每个任务都有完成所需的时间pi和规定了必须在si天或者si天之后才能处理这个任务,且需要在ei天之内完成. 工厂规定每个机器人每天只能处理一个任务,且每个任务最多只能由一个机器处理. 问这些机器人能否在顺利完成这些任务. 题解: 网络流建模. 对于每一个任务来说,它必须要在si到ei天之间被处理. 并且要在pi天以内完成. 所以我们可以把每一天当成点来考虑,

HDU 4907 (杭电BC#3 1001)Task schedule(水)

题目地址:HDU 4907 水题...不多说..哈希后从后往前遍历一遍就行了. 代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include<a

HDU 4907 BestCoder3_1 Task schedule

Task schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description 有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务.有m个询问,每个询问有一个数字q,表示如果在q时间