Task schedule

hdu4907:http://acm.hdu.edu.cn/showproblem.php?pid=4907

题意:中文题。

题解:这一道水题,自己调了很久,并且没有注意到序列可能是乱序的,wa了好几次。我的做法就是,把间距大于=2的数的下标放进set,然后查询的时候,lower_bond一下,找到开始的下标,然后在set中找到第一个间距的下标,即可,注意要处理好边界问题。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<set>
 6 using namespace std;
 7 const int N=2e5+10;
 8 int a[N],n,m,t;
 9 int main(){
10      int cas;
11      scanf("%d",&cas);
12      while(cas--){
13          scanf("%d%d",&n,&m);
14          memset(a,0,sizeof(a));
15          set<int>Q;
16          for(int i=1;i<=n;i++){
17             scanf("%d",&a[i]);
18          }
19             sort(a+1,a+n+1);
20          for(int i=1;i<=n;i++){
21             if(i>1)
22             if(a[i]-a[i-1]>=2)
23              Q.insert(i-1);
24          }
25          for(int i=1;i<=m;i++){
26             scanf("%d",&t);
27             if(t>a[n]+1)printf("%d
",t);
28             else if(t<a[1])printf("%d
",t);
29             else{
30             int temp=lower_bound(a+1,a+n+1,t)-a;
31              if(a[temp]>t&&temp>1)temp--;
32             set<int>::iterator it=Q.lower_bound(temp);
33             if(it==Q.end())
34                 printf("%d
",a[n]+1);
35             else{
36                 printf("%d
",max(a[(*it)]+1,t));
37             }
38           }
39          }
40      }
41 }
View Code
原文地址:https://www.cnblogs.com/chujian123/p/3889425.html