zoukankan      html  css  js  c++  java
  • JZ初中OJ 1566. [GDKOI]幸运锁

    题目描述

    有一把幸运锁,打开它将会给你带来好运,但开锁时需要输入一个正整数(没有前导0)。幸运锁有一种运算,对于一个正整数,返回他的相邻两位数字间的差,如1135,运算结果为22(会去掉前导0)。

    现在已知只有经过反复运算最终结果为7的数才能打开这把锁,给你一个区间[a,b],问该区间中有多少个能打开幸运锁的幸运数。
     

    输入

       第一行两个整数a,b。

    输出

       一个整数K,表示共有多少个这样的数。
     

    样例输入

    1 10

    样例输出

    1
     

    数据范围限制

    【限制】

    1<=a<=b<=10^9。

    30%的数据有b<=10^6。
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int readint() {
     4     int x = 0;
     5     char c = getchar();
     6     for (; c <  '0' || c >  '9'; c = getchar());
     7     for (; c >= '0' && c <= '9'; c = getchar()) x = (x * 10) + (c - '0');
     8     return x;
     9 }
    10 long long toVal(string s) {
    11     long long sum = 0;
    12     for (int i = 0; s[i]; ++i)
    13         sum = (sum * 10) + (s[i] - '0');
    14     return sum;
    15 }
    16 const int MAXN = 170000 + 5;
    17 int x, y, hd, tl, len, ans;
    18 string s, d[MAXN];
    19 void dfs(int pos)
    20 {
    21     long long tmp = 0;
    22     if (pos == len)
    23     {
    24         tmp = toVal(s);
    25         int addnum = 0;
    26         for (; tmp <= y;)
    27         {
    28             d[++tl] = s;
    29             if (tmp >= x && tmp <= y) ++ans;
    30             
    31             s = s[0] + s;
    32             ++addnum;
    33             tmp = toVal(s);
    34         }
    35         s.erase(0, addnum);
    36         return;
    37     }
    38     tmp = (s[pos] - '0') + (d[hd][pos] - '0');
    39     if (tmp <= 9)
    40     {
    41         s += (char)(tmp + '0');
    42         dfs(pos + 1);
    43         s.erase(pos + 1, 1);
    44     }
    45     tmp = s[pos] - d[hd][pos];
    46     if (tmp >= 0 && d[hd][pos] != '0')
    47     {
    48         s += (char)(tmp + '0');
    49         dfs(pos + 1);
    50         s.erase(pos + 1, 1);
    51     }
    52 }
    53 int main()
    54 {
    55     freopen("lucky.in", "r", stdin);
    56     freopen("lucky.out", "w", stdout);
    57     x = readint();
    58     y = readint();
    59     d[tl = 1] = "7";
    60     if (x <= 7 && y >= 7) ++ans;
    61     for (; hd < tl;)
    62     {
    63         len = d[++hd].size();
    64         for (char c = '1'; c <= '9'; ++c) {
    65             s = c;
    66             dfs(0);
    67         }
    68       }
    69     printf("%d
    ", ans);
    70     fclose(stdin);
    71     fclose(stdout);
    72     return 0;
    73 }
  • 相关阅读:
    nyoj-115-城市平乱(dijkstra算法)
    如何在大学里脱颖而出(其二)
    P6880-[JOI 2020 Final]オリンピックバス【最短路】
    P6847-[CEOI2019]Magic Tree【dp,线段树合并】
    P6800-[模板]Chirp Z-Transform【NTT】
    P5470-[NOI2019]序列【模拟费用流】
    P6563-[SBCOI2020]一直在你身旁【dp,单调队列】
    CF587F-Duff is Mad【AC自动机,根号分治】
    P7405-[JOI 2021 Final]雪玉【二分】
    互斥锁,IPC队列
  • 原文地址:https://www.cnblogs.com/dsanying/p/11317211.html
Copyright © 2011-2022 走看看