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 }
  • 相关阅读:
    HDU 2955 Robberies(01背包)
    HDU 2602 Bone Collector(01背包)
    HUST 1352 Repetitions of Substrings(字符串)
    HUST 1358 Uiwurerirexb jeqvad(模拟解密)
    HUST 1404 Hamming Distance(字符串)
    HDU 4520 小Q系列故事――最佳裁判(STL)
    HDU 2058 The sum problem(枚举)
    【破解】修改程序版权、添加弹窗
    HDU 1407 测试你是否和LTC水平一样高(枚举)
    HDU 1050 Moving Tables(贪心)
  • 原文地址:https://www.cnblogs.com/macinchang/p/4790522.html
Copyright © 2011-2022 走看看