任务列表(360公司2017春招真题)

题目描述

现在现在有一台机器,这台机器可以接收两种形式任务:(1)任务列表,任务列表里面有N个任务,对于第i个任务,机器在Ti时间开始执行,并在1个单位时间内做完。(2)临时任务,机器可以在任意时间接收一个临时任务,但任务列表里面的任务优先级要高于临时任务,也就是说当机器空闲的时候才会执行临时任务。
现在机器已经接收一个任务列表。接下来会有M个临时任务,我们想知道每个临时任务何时被执行。为了简化问题我们可以认为这M个临时任务是独立无关即任务是可以同时执行的,互不影响的。
输入
输入数据有多组,每组数据第一行包括两个整数N和M(1<=N, M<=10^5)。
接下来一行有N个不同数字T1,T2,T3.....TN(1<=T1
接下来又M行,每行一个数字Qi(1<=Qi<=10^9),表示第i个临时任务的的接收时间。
输出
对于每个临时任务,输出它被执行的时间。
样例输入
5 6
1 2 3 5 6
3
2
1
4
5
6
样例输出
4
4
4
4
7

7

AC代码:

#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <map>
# define f(i,m,n) for(int i=m; i<=n; i++)
# define sf(x) scanf("%d", &x)
using namespace std;
int n, m, a[100010], x;
map<int, int> mp, dp;
int main() {
	while (scanf("%d%d", &n, &m)!=EOF) {
		mp.clear();dp.clear();
		f(i, 1, n) {
			sf(a[i]);mp[a[i]] = 1;
		}
		sort(a + 1, a + 1 + n);
		dp[a[n]] = a[n] + 1;
		for (int i = n - 1; i >= 1; i--) {
			if (a[i] + 1 == a[i + 1]) dp[a[i]] = dp[a[i + 1]];
			else dp[a[i]] = a[i] + 1;
		}
		f(i, 1, m) {
			scanf("%d", &x);
			if (mp[x]) printf("%d\n", dp[x]);
			else printf("%d\n", x);
		}
	}
}


阅读更多
换一批

没有更多推荐了,返回首页