• 洛谷 P3955 图书管理员 题解


    每日一题 day12 打卡

    Analysis

    模拟+快速幂

    先把图书的编码存起来排序,保证第一个找到的就是最小的。如果要求一个数后x位,就将这个数模10的x次方,同理,我们可以通过这个规律来判断后缀。每个编码和需求码都不超过10000000,所以x<8。为了保险,我使用了快速幂来求10的x次方。

    时间复杂度 O ( n*q*log (8) ) < O(1000000) 可以接受

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define maxn 1000+10
     6 using namespace std;
     7 inline int read() 
     8 {
     9     int x=0;
    10     bool f=1;
    11     char c=getchar();
    12     for(; !isdigit(c); c=getchar()) if(c=='-') f=0;
    13     for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0';
    14     if(f) return x;
    15     return 0-x;
    16 }
    17 inline void write(int x)
    18 {
    19     if(x<0){putchar('-');x=-x;}
    20     if(x>9)write(x/10);
    21     putchar(x%10+'0');
    22 }
    23 int n,q;
    24 int num[maxn];
    25 inline int ksm(int x,int y)
    26 {
    27     int res=1;
    28     while(y>0)
    29     {
    30         if(y&1)
    31             res*=x;
    32         x*=x;
    33         y>>=1;
    34     }
    35     return res;
    36 }
    37 int main()
    38 {
    39     n=read();q=read();
    40     for(int i=1;i<=n;i++) num[i]=read();
    41     sort(num+1,num+n+1);
    42     for(int i=1;i<=q;i++)
    43     {
    44         int len=read(),req=read(),ans=-1;
    45         for(int j=1;j<=n;j++)
    46             if(num[j]%ksm(10,len)==req)
    47             {
    48                 ans=num[j];
    49                 break;
    50             } 
    51         write(ans);
    52         printf("
    ");
    53     }
    54     return 0;
    55 }

    请各位大佬斧正(反正我不认识斧正是什么意思)

  • 相关阅读:
    写给自己的2020年总结
    docker镜像与docker容器
    docker安装&docker简介
    windows 安装linux子系统
    typora设置图床
    让Mysql插入中文
    pip 换源
    Unity中如何将一个场景(Scene)的Light Settings复制给另一个场景
    Windows API开发
    【C#】判断字符串中是否包含指定字符串,contains与indexOf方法效率问题
  • 原文地址:https://www.cnblogs.com/handsome-zyc/p/11517924.html
Copyright © 2020-2023  润新知