[BestCoder Round #3] hdu 4907 Task schedule (模擬簡單題)
阿新 • • 發佈:2017-05-20
using mes family set key problem 占用 時間 task
Problem Description 有一臺機器,而且給你這臺機器的工作表。工作表上有n個任務,機器在ti時間運行第i個任務,1秒就可以完畢1個任務。
有m個詢問,每一個詢問有一個數字q。表示假設在q時間有一個工作表之外的任務請求,請計算何時這個任務才幹被運行。
機器總是依照工作表運行,當機器空暇時馬上運行工作表之外的任務請求。
Input 輸入的第一行包括一個整數T, 表示一共同擁有T組測試數據。
Output 對於每個詢問,請計算並輸出該任務何時才幹被運行。每個詢問輸出一行。
Sample Input
Sample Output
Source BestCoder Round #3
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 (模擬簡單題)