zoj 1403 简单枚举
2017-12-21 21:48
344 查看
题意简述:密码序列是由一系列大写字母组成,在解密序列不唯一的情况下,按字典序输出最后 一个。其中,target是数字,v,w,x,y,z属于同一个集合且各不相同,该集合由题目给出,由26个大写字母中的任意5-12个组成。
思路:这是一道典型的枚举题。题目中,解的值域已经确定,解元素中的v,w,x,y,z都是题目给定集合的一个元素。尽管枚举法的算法复杂度是指数级的,但鉴于给定集合最多有12个元素,完全可以直接用枚举。另外,题目中的约束条件,v,w,x,y,z各不相同,明显不属于解集的元素可以很容易的通过判断来排除。需要注意的是,题目求的密码序列是按字典序输出最后一个,所以要事先将集合元素排好序
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; char letter[15]; int target,value[15]; void process(int len)//计算过程枚举 { int a,b,c,d,e; for(a = 0;a<len;a++) for(b = 0;b<len;b++) if(a!=b)//if语句排除不属于解集的元素 for(c = 0;c<len;c++) if(a!=c&&b!=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\n",value[a] + 'A' - 1,value[b] + 'A' - 1,value[c] + 'A' - 1,value[d] + 'A' - 1,value[e] + 'A' - 1); return; } printf("no solution\n"); } bool compare(int a,int b)//降序排列 { return a > b; } int main() { int i; while(scanf("%d%s",&target,letter)) { if(target == 0&&strcmp(letter,"END") == 0) break; i = 0; while(letter[i])//将字母转化为对应数字 { value[i] = letter[i] - 'A' + 1; i++; } sort(value,value + i,compare);//题意要求按照字典序输出最后一个,就是字典序的倒序输出第一个 process(i); } }
相关文章推荐
- zoj 1403 Safecracker(枚举)
- zoj 1716 又是一道简单题。直接暴力枚举实现!
- zoj 1622 Switch 开关灯 简单枚举
- zoj 1403 Safecracker 枚举
- zoj 1622 Switch 开关灯 简单枚举
- 简单枚举类型——植物与颜色
- C#:枚举、结构与接口简单理解
- C语言中枚举的简单介绍
- ZOJ 2850 Beautiful Meadow (简单题)
- 做 fzu oj 1003 简单的枚举
- ZOJ 3607 Lazier Salesgirl (枚举)
- zoj 3203 Light Bulb(公式推导|三分法)(简单)
- 简单枚举---除法
- ZOJ 1082 简单图论Floyd算法
- ZOJ 1694 Shredding Company(简单DFS)
- 最短路:带限制的最短路,邻接表建图,dijkstra ZOJ 3946+HDU 2680 (简单点的)
- NBUT 1647 又一道简单题【数学+枚举】
- ZOJ 3527 Shinryaku! Kero Musume 【树形DP[带简单环]】
- zoj 3782 Ternary Calculation(简单题,但有陷阱)
- UVA 725 简单枚举