C - Task schedule-二分

来源:互联网 发布:手机开核软件 编辑:程序博客网 时间:2024/05/18 03:42

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;}


0 0
原创粉丝点击