• [洛谷P1822]魔法指纹


    题目传送门

    这道题事实上解并不多,所以我们倒过来从$7$开始搜索。主过程中为广搜,而函数深搜进行拓展。其实是对于前导$0$删去的情况也要考虑,否则只有$20pts$。

    最后别忘了判断$7$在不在$[A,B]$。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 #define rep(i, a, b) for (register int i = a; i <= b; ++i)
     6 
     7 int A, B, ans, pw[10], dB = 0;
     8 
     9 queue< pair<int, int> > q;
    10 
    11 void dfs(int v, int s, int dep, int max_dep, int last) {
    12     if (dep > dB+1) return;
    13     if (dep == max_dep) {
    14         if (s <= B && last) {
    15             q.push(make_pair(s, dep));
    16             if (s >= A) 
    17                 ans++;
    18         }
    19         return;
    20     }
    21     int bit = v % 10;
    22     if (bit+last < 10) dfs(v / 10, s + (bit+last) * pw[dep], dep+1, max_dep, bit+last);
    23     if (last-bit >= 0 && bit != 0) dfs(v / 10, s + (last-bit) * pw[dep], dep+1, max_dep, last-bit);
    24 }
    25 
    26 int main() {
    27     scanf("%d%d", &A, &B)
    28     if (A <= 7 && 7 <= B) ans++;
    29     q.push(make_pair(7, 1));
    30     pw[0] = 1;
    31     rep(i, 1, 9) {
    32         pw[i] = pw[i-1] * 10;
    33         if (B > pw[i]) dB = i;
    34     }
    35 
    36     while (!q.empty()) {
    37         pair<int, int> h = q.front(); q.pop();
    38         rep(i, 0, 9)
    39             dfs(h.first, i, 1, h.second+1, i);
    40         if (h.second <= dB) q.push(make_pair(h.first, h.second+1));
    41     }
    42 
    43     printf("%d", ans);
    44     return 0;
    45 }

    这道题如果要打表也可以,就是表会很大。

  • 相关阅读:
    A Tour of Go For continued
    A Tour of Go For
    Request对象的主要方法
    JAVA中的异常疑点解析
    用JDBC如何调用存储过程
    字节流与字符流的区别
    js判断第二个日期比第一个日期大
    JAVA中会存在内存泄露吗
    mysql 建库建表建用户
    mysql 的数据类型
  • 原文地址:https://www.cnblogs.com/ac-evil/p/10339825.html
Copyright © 2020-2023  润新知