首页 > 其他 > 详细

B - You Are Given a Decimal String... CodeForces - 1202B

时间:2019-10-19 10:52:57      阅读:53      评论:0      收藏:0      [点我收藏+]
#include <bits/stdc++.h>
using namespace std;
/*
这道题的难点在于怎样加x或者y才能使的a转化为b,并且加的x和y的和最少
这道题竟然用了floyd,转换成求最短路

这才深刻地体会到,我根本不会算法
*/
const int maxn=10;
const int INF=0x3f3f3f3f;
int dis[maxn][maxn];
int num[maxn][maxn];
const int len=2e6+10;
char s[len];
int length;
void work(int x,int y)
{
    memset(dis,INF,sizeof dis);//如果INf=0x3f,不能直接memset INF,直接memset 0x3f////0x3f3f3f3f(INF)
    for(int i=0; i<maxn; i++)
        dis[i][(i+x)%10]=dis[i][(i+y)%10]=1;
    for(int k=0; k<maxn; k++)
        for(int i=0; i<maxn; i++)
            for(int j=0; j<maxn; j++)
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
    for(int i=1; i<length; i++)
    {
        int a=s[i-1]-0;
        int b=s[i]-0;
        if(dis[a][b]==INF)
        {
            num[x][y]=-1;
            return ;
        }
        num[x][y]+=(dis[a][b]-1);
    }
}
int main()
{
    scanf("%s",s);
    length=strlen(s);
    for(int i=0; i<maxn; i++)
        for(int j=0; j<=i; j++)
        {
            work(i,j);
            num[j][i]=num[i][j];
        }
    for(int i=0; i<maxn; i++)
    {
        for(int j=0; j<maxn-1; j++)
            printf("%d ",num[i][j]);
        printf("%d\n",num[i][9]);
    }
    return 0;
}

 

B - You Are Given a Decimal String... CodeForces - 1202B

原文:https://www.cnblogs.com/zhangzhenjun/p/11703139.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!