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 }

 

转载于:https://www.cnblogs.com/CtrlKismet/p/6500879.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值