• 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
    ",q); //询问的时间有可能比最大时间大
    52             else printf("%d
    ",(A[q]==0)?q:A[q]);
    53         }
    54     }
    55     //clock_t ed=clock();
    56     //printf("
    
    Time Used : %.5lf Ms.
    ",(double)(ed-st)/CLOCKS_PER_SEC);
    57     return 0;
    58 }
  • 相关阅读:
    最受欢迎的北大通选课导读·1[精品]
    社会保险,
    养老金的计算,
    毫秒 后的一个计算,
    返回格式 的数据结构再次改造,
    阶段状态池子,
    生活,-摘
    融合,
    tableview 也可以实现这个效果,
    字体大小 一致起来,
  • 原文地址:https://www.cnblogs.com/CtrlKismet/p/6500879.html
Copyright © 2020-2023  润新知