zoukankan      html  css  js  c++  java
  • Gym

     Gym - 100338E

    题意:给你n,k问在1-n中能整出k的字典序最小的数。范围1018

    思路:比较简单的贪心了,枚举10的幂m,然后加上k-m%k, 更新答案就可以了,数据一定要用unsigned long long,我就在这里挂了几次,查了半天。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <fstream>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <deque>
     7 #include <vector>
     8 #include <queue>
     9 #include <string>
    10 #include <cstring>
    11 #include <map>
    12 #include <stack>
    13 #include <set>
    14 #define LL unsigned long long
    15 #define eps 1e-8
    16 #define INF 0x3f3f3f3f
    17 #define MAXN 10005
    18 using namespace std;
    19 LL n, k;
    20 LL m[25];
    21 //char s[25], res[25];
    22 vector<char> s, t, res;
    23 int main()
    24 {
    25 #ifdef ONLINE_JUDGE
    26     freopen("numbers.in", "r", stdin);
    27     freopen("numbers.out", "w", stdout);
    28 #endif //ONLINE_JUDGE
    29     m[0] = 1;
    30     for (int i = 1; i <= 19; i++){
    31         m[i] = m[i - 1] * 10ULL;
    32     }
    33     while (~scanf("%I64d%I64d", &n, &k)){
    34         if (n == 0 && k == 0) break;
    35         for (int i = 0; i <= 19; i++){
    36             LL p = m[i] % k == 0 ? m[i] : m[i] + k - (m[i] % k);
    37             if (p > n) break;
    38             if (p % k != 0) continue;
    39             t.clear();
    40             while (p != 0){
    41                 t.push_back(p % 10ULL + '0');
    42                 p /= 10ULL;
    43             }
    44             s.clear();
    45             for (int j = t.size() - 1; j >= 0; j--){
    46                 s.push_back(t[j]);
    47             }
    48             if (i == 0){
    49                 res = s;
    50                 continue;
    51             }
    52             bool flag = true;
    53             for (int j = 0; j < s.size(); j++){
    54                 if (res.size() < j + 1){
    55                     flag = true;
    56                     break;
    57                 }
    58                 if (s[j] > res[j]){
    59                     flag = true;
    60                     break;
    61                 }
    62                 if (s[j] == res[j]) continue;
    63                 flag = false;
    64                 break;
    65             }
    66             if (flag) continue;
    67             res = s;
    68         }
    69         for (int i = 0; i < res.size(); i++){
    70             printf("%c", res[i]);
    71         }
    72         printf("
    ");
    73     }
    74 }
  • 相关阅读:
    Linux安装.net core
    在IIS中如何配置SSL(https)
    Lambda的前世今生
    Java建造者模式
    leetcode 83 Remove Duplicates from Sorted List
    【设计】Office
    【设计】简书品牌重构
    【设计总结】
    【交互设计】
    【设计总结】
  • 原文地址:https://www.cnblogs.com/macinchang/p/4790522.html
Copyright © 2011-2022 走看看