码迷,mamicode.com
首页 > 其他好文 > 详细

[CF1202B] You Are Given a Decimal String(最短路)

时间:2019-08-16 21:12:05      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:portal   char   flag   out   oid   ==   debug   生成器   uri   

Description

今天突然想来发一篇博客防死

[Portal][https://vjudge.net/problem/2650668/origin]

定义被x-y生成器生成的序列为, 一开始有一个数字S = 0, 每次输出S % 10, 然后把这个数字加上x或y.

现在给你一个串, 对于$0\leq x, y \leq 9 $要你计算至少要在串中插入几个数位才能将其变成正确的x - y生成器生成的串

字符串长度\(\leq 2e6\)

Solution

这种数字之间跳来跳去的直接考虑最短路.

\(i\)\((i + x) \mod 10\), 连一条边权为1的单向边.

\(i\)\((i + y) \mod 10\), 连一条边权为1的单向边.

\(dis[i][i] = inf\)

直接跑floyd即可, 那么答案就是数字之间的距离-1的和.

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a), i##_end_ = (b); i <= i##_end_; ++i)
#define drep(i, a, b) for(int i = (a), i##_end_ = (b); i >= i##_end_; --i)
#define clar(a, b) memset((a), (b), sizeof(a))
#define debug(...) fprintf(stderr, __VA_ARGS__)
typedef long long LL;
typedef long double LD;
const double pi = acos(-1);
const int BUF_SIZE = (int)1e6 + 10;
template <typename T> inline bool chkmax(T &a, const T &b) {return a < b ? a = b, 1 : 0;}
template <typename T> inline bool chkmin(T &a, const T &b) {return a > b ? a = b, 1 : 0;}
LL read() {
    char ch = getchar();
    LL x = 0, flag = 1;
    for (;!isdigit(ch); ch = getchar()) if (ch == '-') flag *= -1;
    for (;isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
    return x * flag;
}

const int Maxn = 2e6 + 9;
char s[Maxn];

void Init() {
    scanf("%s", s + 1);
}

int dis[10][10];
int calc(int x, int y) {
    clar(dis, 0x3f);
    rep (i, 0, 9) dis[i][(i + x) % 10] = 1, dis[i][(i + y) % 10] = 1;

    rep (k, 0, 9)
        rep (i, 0, 9)
            rep (j, 0, 9) dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);

    int ans = 0;
    rep (i, 1, strlen(s + 1) - 1) {
        if (dis[s[i] - '0'][s[i + 1] - '0'] == 0x3f3f3f3f) return -1;
        ans += max(dis[s[i] - '0'][s[i + 1] - '0'] - 1, 0);
    }
    return ans;
}

void Solve() {
    rep (i, 0, 9) {
        rep (j, 0, 9) printf("%d ", calc(i, j));
        puts("");
    }
}

int main() {
//  freopen("bosky.in", "r", stdin);
//  freopen("bosky.out", "w", stdout);

    Init();
    Solve();

#ifdef Qrsikno
    debug("\nRunning time: %.3lf(s)\n", clock() * 1.0 / CLOCKS_PER_SEC);
#endif
    return 0;
}

[CF1202B] You Are Given a Decimal String(最短路)

标签:portal   char   flag   out   oid   ==   debug   生成器   uri   

原文地址:https://www.cnblogs.com/qrsikno/p/11365961.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!