百练1248:Safecracker

题目链接:http://bailian.openjudge.cn/practice/1248/

题目大意:

给定一个正数target(小于12000000)和一串由大写字母组成的数组(长度为5~12),从数组中挑出5个字母,用v,w,x,y,z表示,这5个字母满足如下关系:

    v - w2+ x3- y4+ z5= target   其中A=1,B=2,...,Z= 26

当存在多个满足条件的解时,输出按字典序排序的最后一个解

分析:

  暴力搜索,将输入的字符串转换为数字(1~26),并将其从大到小排序,以保证遍历时遇到的第一个解时字典序最大的解。

#include <cstdio>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string quote;
char temp[15];bool compare(int a,int b){
    return a > b;
}

int main(){
    unsigned int target;
    vector<int> v;
    int two[27];
    int three[27];
    int four[27];
    int five[27];
    for(int i = 1;i <= 26;i++){
        int p = i;
        two[i] = p*p;
        three[i] = two[i] * p;
        four[i] = three[i] * p;
        five[i] = four[i] * p;
    }
    bool find;
    while(true){
        scanf("%d%s",&target,temp);
        quote = temp;
        if(target == 0 && quote == "END")break;
        v.clear();
        int L = quote.length();
        for(int i = 0;i < L;i++)
            v.push_back(quote[i] - ‘A‘ + 1);
        sort(v.begin(),v.end(),compare);
        int size = v.size();
        find = false;
        for(int j = 0;j < size;j++){
            for(int k = 0;k < size;k++){
                if(k == j)continue;
                for(int m = 0;m < size;m++){
                    if(m == k || m == j )continue;
                    for(int n = 0;n < size;n++){
                        if(n == m || n == k || n == j )continue;
                        for(int i = 0;i < size;i++){
                            if(i == j || i == k || i == m || i == n)continue;
                            //if(five[v[i]] < target)break; //最开始剪枝剪错了。。。
                            if(v[j] - two[v[k]] + three[v[m]] - four[v[n]] + five[v[i]]== target)
                            {printf("%c%c%c%c%c\n",v[j]+‘A‘-1,v[k]+‘A‘-1,v[m]+‘A‘-1,v[n]+‘A‘-1,v[i]+‘A‘-1);find = true;break;}
                        }
                        if(find)break;
                    }
                    if(find)break;
                }
                if(find)break;
            }
            if(find)break;
        }
        if(!find)puts("no solution");
    }
}
时间: 2024-08-28 04:17:04

百练1248:Safecracker的相关文章

[OpenJudge] 百练2754 八皇后

八皇后 Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题一共有92组解(即92个不同的皇后串).给出一个数b,要求输出第b个串.串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小. I

poj 百练 2765 八进制小数(精度问题)

2765:八进制小数 查看 提交 统计 提示 提问 总时间限制:  1000ms  内存限制:  65536kB 描述 八进制小数可以用十进制小数精确的表示.比如,八进制里面的0.75等于十进制里面的0.963125 (7/8 + 5/64).所有小数点后位数为n的八进制小数都可以表示成小数点后位数不多于3n的十进制小数. 你的任务是写一个程序,把(0, 1)中的八进制小数转化成十进制小数. 输入 输入包括若干八进制小数,每个小数占用一行.每个小数的形式是0.d1d2d3 ... dk,这里di

ACM/ICPC 之 递归(POJ2663-完全覆盖+POJ1057(百练2775)-旧式文件结构图)

POJ2663-完全覆盖 题解见首注释 //简单递推-三个米诺牌(3*2)为一个单位打草稿得出规律 //题意-3*n块方格能被1*2的米诺牌以多少种情况完全覆盖 //Memory 132K Time: 0 Ms #include<iostream> #include<cstring> #include<cstdio> using namespace std; int ans; //开始平铺 int Tiling(int n) { int sum = 0; if (n =

百练8216-分段函数-2016正式A题

百练 / 2016计算机学科夏令营上机考试 已经结束 题目 排名 状态 统计 提问 A:分段函数 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 编写程序,计算下列分段函数y=f(x)的值. y=-x+2.5; 0 <= x < 5 y=2-1.5(x-3)(x-3); 5 <= x < 10 y=x/2-1.5; 10 <= x < 20 输入 一个浮点数N,0 <= N < 20 输出 输出N对应的分段函数值:f

百练 1088 滑雪

“人人为我”的解法: dp[i][j]表示坐标为(i,j)的点开始下滑的最大长度. 则dp[i][j]为(i,j)周围四个点中比(i,j)低,且最大长度最大再加一的值 用结构体来储存一个点的坐标和高度,这样按高度从小到大排完序以后还不会丢失坐标的值 从小到大遍历所有的点,经过一个点(i,j)时,用递推公式求L(i,j). 一个小技巧: 将矩阵height四周的值赋值为INF,你可以想想这是滑雪场四周非常非常高的围墙. 这样就避免了数组越界的判断,而且不会影响正确结果(因为我们找的是滑雪场内部的最

百练6255-单词反转-2016正式B题

百练 / 2016计算机学科夏令营上机考试 已经结束 题目 排名 状态 统计 提问 B:单词翻转 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个句子(一行),将句子中的每一个单词翻转后输出. 输入 只有一行,为一个字符串,不超过500个字符.单词之间以空格隔开. 输出 翻转每一个单词后的字符串,单词之间的空格需与原文一致. 样例输入 hello world 样例输出 olleh dlrow 1 #include <iostream> 2 #i

百练1088:滑雪 【DP】+【DFS】

总Time Limit: 1000ms Memory Limit: 65536kB Description Michael喜欢滑雪百这并不奇怪, 由于滑雪的确非常刺激.但是为了获得速度,滑的区域必须向下倾斜,并且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长的滑坡.区域由一个二维数组给出.数组的每一个数字代表点的高度.以下是一个 样例 1  2  3  4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 1

POJ百练—IP地址转换

#include<iostream> #include<cstdio> #include<cstring> using namespace std; int sign[9]; void change_to_8(int x) { int index=8; while(x) { if(x&1) { sign[index]=1; } x>>=1; index--; } } int main() { int a[4]; while(scanf("%

百练OJ:2804词典

题目是这样的: 2804:词典 总时间限制:  3000ms 内存限制:  65536kB 描述 你旅游到了一个国外的城市.那里的人们说的外国语言你不能理解.不过幸运的是,你有一本词典可以帮助你. 输入 首先输入一个词典,词典中包含不超过100000个词条,每个词条占据一行.每一个词条包括一个英文单词和一个外语单词,两个单词之间用一个空格隔开.而且在词典中不会有某个外语单词出现超过两次.词典之后是一个空行,然后给出一个由外语单词组成的文档,文档不超过100000行,而且每行只包括一个外语单词.输