HDOJ4907解题报告【思维题】

题目地址: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 }

 

posted @ 2017-03-04 11:37  CtrlKismet  阅读(167)  评论(0编辑  收藏  举报