题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4907
题目概述:
中文题概述就略了吧……
大致思路:
想法其实挺直白的,从最大的一个时间向前循环,如果满足经过的时间满足公差是1就不修改答案,否则答案为当前数字+1.
关键是有些小细节要注意一下,写在代码的注释里了。
复杂度分析:
由思路可以很明显的算出复杂度是线性的,但是我们需要先将输入排个序,也即O(n*logn),综合起来就是O(n*logn*T),其中n的含义如题述,T为数据组数。
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cmath> 5 #include <vector> 6 #include <ctime> 7 #include <map> 8 #include <queue> 9 #include <cstring> 10 #include <algorithm> 11 using namespace std; 12 13 #define sacnf scanf 14 #define scnaf scanf 15 #define maxn 100010 16 #define maxm 26 17 #define inf 1061109567 18 #define Eps 0.00001 19 const double PI=acos(-1.0); 20 #define mod 7 21 #define MAXNUM 10000 22 void Swap(int &a,int &b) {int t=a;a=b;b=t;} 23 double Abs(double x) {return (x<0)?-x:x;} 24 typedef long long ll; 25 typedef unsigned int uint; 26 27 int a[maxn],A[2*maxn]; //A数组要开两倍,因为下标意味着时间 28 29 int main() 30 { 31 //freopen("data.in","r",stdin); 32 //freopen("data.out","w",stdout); 33 //clock_t st=clock(); 34 int T,n,m,q;scanf("%d",&T); 35 while(T--) 36 { 37 scanf("%d%d",&n,&m); 38 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 39 sort(a+1,a+1+n); //需要排序 40 for(int i=1;i<=a[n];i++) A[i]=0; //多组数据一定要初始化 41 int ans=a[n]+1,num=a[n]; 42 for(int i=n;i>=1;i--) 43 { 44 if(num==a[i]) num--; 45 else {num=a[i]-1;ans=a[i]+1;} 46 A[a[i]]=ans; 47 } 48 for(int i=1;i<=m;i++) 49 { 50 scanf("%d",&q); 51 if(q>a[n]) printf("%d\n",q); //询问的时间有可能比最大时间大 52 else printf("%d\n",(A[q]==0)?q:A[q]); 53 } 54 } 55 //clock_t ed=clock(); 56 //printf("\n\nTime Used : %.5lf Ms.\n",(double)(ed-st)/CLOCKS_PER_SEC); 57 return 0; 58 }