zoukankan      html  css  js  c++  java
  • ZOJ-1403-Safecracker(简单枚举)

    https://zoj.pintia.cn/problem-sets/91827364500/problems/91827364902

    题意:

    密码序列由一系列大写字母组成,在解密序列不唯一的情况下,按字典序输出最后一个。

    解密公式;

                   v-w^2+x^3-y^4+z^5=target

    其中target是数字,由题目给出,v,w,x,y,z,属于同一个集合且各不相同,该集合由题目给出,由26个大写字母中任意5~12个组成,每个字母对应的数值,依次类推(A=1,B=2...).

    思路:

    这是一个枚举题型,题目中解的值域已定,只需要枚举5个变量的值,由于五个变量的范围不超过12,所以指数级别的枚举完全没问题。

    由于按字典序的最后一个输出,就是字典序最大,所以事先排个序即可。

    代码:

    #include <iostream>
    #include <cmath>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    
    char letters[15];
    int value[15], target;
    
    void solve(int len)
    {
        int a, b, c, d, e;
        for(a=0; a<len; a++)
            for(b=0; b<len; b++)
                if(a!=b)
                    for(c=0; c<len; c++)
                        if(b!=c&&a!=c)
                            for(d=0; d<len; d++)
                                if(a!=d&&b!=d&&c!=d)
                                    for(e=0; e<len; e++)
                                        if (a != e && b != e && c != e && d != e)
                                        {
                                            if (value[a] - pow(value[b], 2.0) + pow(value[c], 3.0)
                                                - pow(value[d], 4.0) + pow(value[e], 5.0) == target)
                                            {
                                                printf("%c%c%c%c%c
    ", value[a] + 'A' - 1, value[b] + 'A' - 1,
                                                    value[c] + 'A' - 1, value[d] + 'A' - 1, value[e] + 'A' - 1);
                                                    return;
                                            }
                                        }
        printf("no solution
    ");
    }
    
    bool cmp(int a, int b)
    {
        return a > b;
    }
    
    int main()
    {
        while (cin >> target>>letters)
        {
            memset(value, 0, sizeof(value));
            if (target == 0 && strcmp(letters, "END") == 0)
                return 0;
            int i = 0;
            while (letters[i])
            {
                value[i] = letters[i] - 'A' + 1;
                i++;
            }
            sort(value, value + i, cmp);
            solve(i);
        }
        return 0;
    }

      

  • 相关阅读:
    SIP协议
    Jenkins 使用
    JMeter测试报告
    JMeter接口测试
    JMeter学习2
    JMeter学习1
    Docker
    WebLog Expert
    sqlmap11种常见方法
    网络
  • 原文地址:https://www.cnblogs.com/sweetlittlebaby/p/14282592.html
Copyright © 2011-2022 走看看