1. 程式人生 > >[BestCoder Round #3] hdu 4907 Task schedule (模擬簡單題)

[BestCoder Round #3] hdu 4907 Task schedule (模擬簡單題)

using mes family set key problem 占用 時間 task

Task schedule



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 <= 50
2. 1 <= n, m <= 10^5
3. 1 <= ti <= 2*10^5, 1 <= i <= n
4. 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

Source BestCoder Round #3


解題思路:

一開始想的是假設當前時間沒有被占用,時間輸出當前時間,假設被占用,就向後查找。知道找到空暇時間為止,但這是超時的.....每次詢問都要向後查找,並且詢問的次數又那麽多,肯定不行。後來打表預處理一下。把每一個時間的任務的空暇時間預先處理。這樣查詢的時候就O(1)了。

代碼:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn=1e5+5;
bool hash[maxn*2];
int f[maxn*2];
int T,n,m,ti,q;

void prepare()
{
    int cur=maxn*2;//始終是空暇時間
    for(int i=maxn*2;i>=1;i--)
    {
        if(hash[i]==0)
            cur=i;
        f[i]=cur;
    }
}

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        memset(hash,0,sizeof(hash));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&ti);
            hash[ti]=1;
        }
        prepare();
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&q);
            printf("%d\n",f[q]);
        }
    }
    return 0;
}


[BestCoder Round #3] hdu 4907 Task schedule (模擬簡單題)