hihocoder1251 Today Is a Rainy Day(暴力)

题意:

给你两个长度不超过110的数字串,只有1-6,让你把下面的串通过最少的操作变为上面的串

操作1:改变一个位置的数字

操作2:选取1-6其中的一个数字,让串中所有等于这个数字的数字全部变为一个其他的数字

思路:

当时做的时候一直在考虑怎么解决操作2的次序问题(如第四组样例,需要转换7次)

最后也是没能很好的实现,补题时原来是用bfs完成的这个操作

如果当前是123456的话不需要改变,也就是需要0次

然后将他所有能到的下一个串赋为1,再下一个赋为2。。。。一直到全部有值

这样每次暴力六位六进制(46656)来枚举操作2的所有结果,然后再加上操作1的次数就可以了

/* ***********************************************
Author        :devil
************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include <string>
#include <time.h>
#include <cmath>
#include <stdlib.h>
#define LL long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define ou(a) printf("%d\n",a)
#define pb push_back
#define mkp make_pair
template<class T>inline void rd(T &x)
{
    char c=getchar();
    x=0;
    while(!isdigit(c))c=getchar();
    while(isdigit(c))
    {
        x=x*10+c-‘0‘;
        c=getchar();
    }
}
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
using namespace std;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const int N=46656;
char a[111],b[111];
int dp[N],g[6],eg[6][6],c[6],t[6];
int idx(int c[])
{
    int ret=0;
    for(int i=0;i<6;i++) ret=ret*6+c[i];
    return ret;
}
void ridx(int s,int c[])
{
    for(int i=5;i>=0;i--)
    {
        c[i]=s%6;
        s/=6;
    }
}
void init()
{
    for(int i=0;i<6;i++) c[i]=i;
    int s=idx(c);
    memset(dp,inf,sizeof(dp));
    dp[s]=0;
    queue<int>q;
    q.push(s);
    while(!q.empty())
    {
        s=q.front();
        q.pop();
        ridx(s,c);
        for(int i=0;i<6;i++)
            for(int j=0;j<6;j++)
            {
                memcpy(t,c,sizeof(t));
                for(int k=0;k<6;k++)
                    if(t[k]==i)
                        t[k]=j;
                int v=idx(t);
                if(dp[v]>dp[s]+1)
                {
                    dp[v]=dp[s]+1;
                    q.push(v);
                }
            }
    }
}
int main()
{
#ifndef ONLINE_JUDGE
IN
#endif
    init();
    while(~scanf("%s%s",a,b))
    {
        memset(g,0,sizeof(g));
        memset(eg,0,sizeof(eg));
        int n=strlen(a);
        for(int i=0;i<n;i++)
        {
            int u=b[i]-‘1‘,v=a[i]-‘1‘;
            g[u]++;
            eg[u][v]++;
        }
        int ans=inf;
        for(int s=0;s<N;s++)
        {
            ridx(s,t);
            int tmp=dp[s];
            for(int i=0;i<6;i++) tmp+=g[i]-eg[i][t[i]];
            ans=min(ans,tmp);
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-23 09:26:34

hihocoder1251 Today Is a Rainy Day(暴力)的相关文章

[uvalive 7263] Today Is a Rainy Day(暴力,BFS,dp)

题目链接:https://vjudge.net/problem/UVALive-7263 题意:给两个字符串a,b,只包含1~6的数字,现在允许两种操作:1.修改某一位数字,2.修改整个串的某个数字,变成另外一个数字.问从a到b的最少操作. 首先2操作修改的比较多,假如都能打到最优解的情况下,尽可能多的2操作一定会比较优. 我们可以先不考虑字符串具体的变化,先考虑只有6位数的2操作的变化情况. 以012345为起点,预处理出需要多少种2操作才可以变成一个6为的目标串. 不必关心每一种数字有多少个

二叉树的后序遍历(暴力版) 小白菜oj 1034

给出二叉树的前序遍历和中序遍历,求二叉树的后序遍历-- 作为一个搜索蒟蒻,我真的没有办法很和谐的A掉,但估计过几天就会写有关这个题的和谐的解法--但只是估计-- 下面讲述我的超暴力解法-- 首先,先由前序遍历得到一个父亲节点,然后再由中序遍历得到这个父亲节点的左子树和右子树中的元素(中序遍历中,该点的左边的所有点,都在它的左子树,右边的都在它的右子树,子树中的根节点是在这些节点的前序遍历中排名最靠前的),然后递归建树,之后在递归求后序遍历即可. 但这个方法有两个比较--&¥--&的问题:1

玲珑杯 round18 A 计算几何瞎暴力

题目链接 : http://www.ifrog.cc/acm/problem/1143 当时没看到坐标的数据范围= =看到讨论才意识到,不同的坐标最多只有1k多个,完全可以暴力做法,不过也要一些技巧. 首先注意数很大可能爆int,用LL得话注意强制转换或者全设为LL,假如  int a=50000,b=a;  LL sum=a*b; 则会爆出,除非ab都是LL 或者 sum=(LL)a*(LL)b; 还有就是R最大就是30,我们不妨设ans[i]表示R<=i的组合个数,做一个前缀和方便快速询问.

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击

A. The Fault in Our Cubes 暴力dfs

http://codeforces.com/gym/101257/problem/A 把它固定在(0,0, 0)到(2, 2, 2)上,每次都暴力dfs检查,不会超时的,因为规定在这个空间上,一不行,就会早早退出. 这样写起来比较好写. #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <

HDU 5690 All X 暴力循环节

分析:暴力找循环节就好了 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <string> #include <stack> #include <vector> #include <map> #include <queue> #inc

Codeforces Round #281 (Div. 2) A. Vasya and Football 暴力

A. Vasya and Football Vasya has started watching football games. He has learned that for some fouls the players receive yellow cards, and for some fouls they receive red cards. A player who receives the second yellow card automatically receives a red

防止ssh暴力破解linux密码

网上看到一篇安全方面的文章,常用的网站收藏无法收藏,于是放这里先.具体功能还未测试,请慎用. 下面是博客原文转载,感谢作者辛苦劳动: 服务器在互联网中,每天都有些没事儿干的人在你的机器端口扫来扫去,让管理员非常烦恼.本文描述一个方法,利用本文介绍的脚本结合iptables服务一并使用,用来防止公网计算机通过ssh进行用户口令暴力破解.目前稳重脚本已经在其他项目的实际运营环境中得到验证. 脚本内容: #!/bin/bash # 防SSH密码暴力破解脚本 # 通过分析secure日志文件使用ipta

HDOJ 4687 Boke and Tsukkomi 一般图最大匹配带花树+暴力

一般图最大匹配带花树+暴力: 先算最大匹配 C1 在枚举每一条边,去掉和这条边两个端点有关的边.....再跑Edmonds得到匹配C2 如果C2+2==C1则这条边再某个最大匹配中 Boke and Tsukkomi Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total Submission(s): 649    Accepted Submission(s): 202