http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=52405
有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务。
有m个询问,每个询问有一个数字q,表示如果在q时间有一个工作表之外的任务请求,请计算何时这个任务才能被执行。
机器总是按照工作表执行,当机器空闲时立即执行工作表之外的任务请求。
思路:输入的时候把所有用过的时间标记一下
再for一遍把没占用的时间都存到一个数组
然后每次 请求 用二分找到 》那个请求时间的第一个数
如果找到的数大于最大的已占用时间,直接输出那个数
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
int nm[200000+5];
int vis[200000+5];
int zuobiao[200000+5];
int main()
{
int t;
cin>>t;
while(t--)
{
int tmp;
memset(vis,0,sizeof(vis));
int n,m;
cin>>n>>m;
int i,j;
int max=0;
for (i=1;i<=n;i++)
{
scanf("%d",&tmp);
vis[tmp]=1;
if (tmp>max)
max=tmp;
}
int ok=0;
for (i=1;i<=max+1;i++)
{
if (vis[i]==0)
zuobiao[++ok]=i;
}
int last=1;
for (i=1;i<=m;i++)
{
scanf("%d",&nm[i]);
}
for (i=1;i<=m;i++)
{
if (nm[i]>max)
{
printf("%d\n",nm[i]);
continue;
}
int tt= lower_bound(zuobiao+1,zuobiao+1+ok, nm[i])-&zuobiao[1]+1 ;
printf("%d\n",zuobiao[tt]);
}
}
return 0;
}