[蓝桥杯]ALGO-181.算法训练_According to Bartjens
- 问题描述
- 计算器和计算机的大量普及也有其弊端。即便是受过专业技术训练的学生们也很可能缺乏计算能力。由于电脑的大量使用,很多人无法心算出7*8这样的算式,甚至是用纸和笔也算不出13*。不过谁在意呢?
- Bartjens教授十分在意——因为他比较传统。他决定给学生布置一些计算作业,并且不能使用电子设备。为了批改方便,他决定使得几乎所有题答案都是2000,不过不全是,否则会被学生发现然后就不仔细计算了。
- 不幸的是,Bartjens教授的打印机实在是太旧了,不能和新的打印机兼容。打印出了题目后,教授发现所有的符号都丢失了!例如2100-=,被打印成了2100100=。不过,数字和等号被正确的打印了。
- 更糟糕的是,教授的试题原稿不见了。因此,他需要恢复出这些题原来的样子。如果答案是2000,那么2100100=可能是:
- -=
- **+=
- **-=
- **=
- *-*-+=
- Bartjen教授记得几点:
- .他写的数字没有前导零。例如2**=就是不可行的。
- .他写0的时候不会写多个0。例如2*+=就是不可行的。
- .他只用二元运算符,不用取负。所以2*-*-+=也不合法。
- .他只用+、-、*,不用/和括号。
- .这些算式按照正常的优先级顺序计算。
- 你需要帮助barjen教授恢复这些题目。你需要在算式中插入至少一个运算符,使得答案是2000。有多少种可能的算式呢?
- 输入格式
- 输入包含一组数据。这组数据有n个数字(<=n<=),后面跟着一个=号。
- 输出格式
- 输出包含若干行,每一行是一个可行的解,具体格式见样例。按字典序从小到大输出这些字符串。如果无解,输出一行IMPOSSIBLE。
- 样例输入
- =
- 【样例输出】
- **+=
- **-=
- -=
- 数据规模和约定
- <=n<=
题目描述
代码如下:
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define USE_LEN 10
- #define OPERATE_LEN 4
- #define RES 2000
- int flag = ;
- void judge(int index,const char *arr,const char *ch)
- {
- int i,j,tmp,sum,res;
- int tmp_num[USE_LEN]; //存储组合的数字
- char tmp_ch[USE_LEN];
- //1.验证是否符合要求
- tmp=sum=;
- for (i= ; i<index ; i++) //遍历输入的数字
- {
- //组合数字
- if (sum == )
- {
- sum = arr[i]-'';
- }
- else
- {
- sum = sum*+(arr[i]-'');
- }
- if (ch[i]!=' ')
- {
- tmp_num[tmp] = sum;
- tmp_ch[tmp] = ch[i];
- sum = ;
- tmp ++;
- }
- else
- {
- if (sum== && i!=index-)
- return ;//0***的数字不符合要求
- }
- }
- //2.验证是否满足要求
- res = tmp_num[];
- i=,j=; //i标记运算符下标 , j标记数字
- while (j < tmp)
- {
- if (tmp_ch[j] =='*')
- {
- sum = tmp_num[j];
- while (tmp_ch[j] == '*')
- {
- sum *= tmp_num[++j];
- }
- }
- else
- {
- sum = tmp_num[j];
- }
- switch(tmp_ch[i])
- {
- case '+':res +=sum;break;
- case '-':res -=sum;break;
- case '*':res *=sum;break;
- }
- i = j++;
- }
- //3.打印符合要求的式子
- if (res == RES)
- {
- flag ++;
- for (i= ; i<index ; i++)
- {
- printf("%c",arr[i]);
- if (ch[i]!=' ' && ch[i]!=)
- printf("%c",ch[i]);
- }
- printf("=\n");
- }
- return ;
- }
- void dfs(int index,int len,const char *arr,char *ch)
- {
- int i;
- char operate[OPERATE_LEN] = {'*','+','-',' ',}; //可用运算符
- if (len == )//运算符插入完成 (符号数比数字少1)
- {
- judge(index+,arr,ch); //判断插入运算符后的式子是否符合要求
- return ;
- }
- else
- {
- for (i= ; i<OPERATE_LEN ; i++)
- {
- ch[index] = operate[i];//插入运算符
- dfs(index+,len-,arr,ch);
- }
- }
- return ;
- }
- int main(void)
- {
- char arr[USE_LEN]; //存储输入数据
- char ch[USE_LEN]; //存储插入的符号 (放在每个数字后面)
- memset(arr,,sizeof(arr));
- memset(ch,,sizeof(ch));
- scanf("%s",arr);
- if (strcmp(arr,"2000=") == ) //至少插入一个运算符
- {
- printf("IMPOSSIBLE");
- return ;
- }
- else
- {
- dfs(,strlen(arr)-,arr,ch); //枚举情况
- }
- if (flag == )
- printf("IMPOSSIBLE");
- return ;
- }
C解法
解题思路:
将运算符“*”,“+”,“-”,“ ”插入到数字中,
枚举其不同组合情况下符合条件的。
采用DFS搜索满足条件的组合
[蓝桥杯]ALGO-181.算法训练_According to Bartjens的更多相关文章
- 蓝桥杯练习系统— 算法训练 Beaver's Calculator
问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator 1.0".它非常特别,并且被计划使用在各种各样 ...
- 蓝桥杯练习系统算法训练习题加答案java版本
附上百度文库的链接:http://wenku.baidu.com/view/afb78d36b42acfc789eb172ded630b1c59ee9bf7
- python+java蓝桥杯ACM日常算法题训练(一)10基础题
目录 1.简单的a+b 2.第一个HelloWorld程序! 3.三个数最大值 4.密码破译 5.母牛的故事 6.7.8.9.10 @(这里写自定义目录标题) 算法题训练网站:http://www.d ...
- 蓝桥杯 algo——6 安慰奶牛 (最小生成树)
问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计 划除去P条道路中尽可能多的道路 ...
- 蓝桥杯 C语言 入门训练 Fibonacci数列
问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...
- 蓝桥杯 C语言 入门训练 序列求和
问题描述 求1+2+3+...+n的值. 输入格式 输入包括一个整数n. 输出格式 输出一行,包括一个整数,表示1+2+3+...+n的值. 样例输入 4 样例输出 10 样例输入 100 说明:有一 ...
- 蓝桥网试题 java 算法训练 区间k大数查询
-------------------------------------------------------------------------- 数组也有sort方法 尽量把输入和操作分开写 -- ...
- 算法训练 K好数(C/C++)AC码
蓝桥杯 算法训练 K好数 AC码 题目要求: 算法训练 K好数 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如 ...
- Java实现 蓝桥杯VIP 算法训练 连通分块(并查集)
试题 算法训练 连通分块 资源限制 时间限制:200ms 内存限制:8.0MB 问题描述 连通分块 输入格式 输入的第一行包含两个整数n, m n代表图中的点的个数,m代表边的个数 接下来m行,每行2 ...
随机推荐
- prometheus告警配置注意事项
global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minut ...
- 6 款最棒的 Go 语言 Web 框架简介
地址: https://studygolang.com/articles/11897?fr=sidebar
- PAT 1081 Rational Sum
1081 Rational Sum (20 分) Given N rational numbers in the form numerator/denominator, you are suppo ...
- 一个简单CI/CD流程的思考
因为公司有两地研发团队,在统一CI/CD上难度不亚于两家公司合并后的新流程建立,并非不可攻克,简单描述下心得. 首先,代码管理使用gerrit -> 因其强大的 codereview 功能被选中 ...
- Winform关于未找到元数据文件.exe和不包含适合于入口点的静态“Main”方法
在三层架构中ItcastCaterModel项目是被其他项目引用的,所以输出类型为类库.
- python3练习-发送IP地址到邮箱(使用日志)
看了下python下的logging模块,和java的log4j差不多,把之前的代码改为使用log配置的方式实现功能(需求和之前的相同,地址"http://www.cnblogs.com/G ...
- Python---高级函数map, filter, zip, enumerate等的用法
今天看自然语言处理这本书的时候,被这里的高级函数的概念吸引了,因为我觉得所有的函数都只是函数而已,是为了实现特定功能而实现的,不应该有高级,低级之分啊!不过了解之后,发现这几个函数确实是有点高级,非常 ...
- Forth 内存布局
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- python编码及转换
第一种:ASCII码 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于 ...
- Android开发 ---基本UI组件5:监听下拉选项,动态绑定下拉选项、全选/反选,取多选按钮的值,长按事件,长按删除,适配器的使用,提示查询数据,activity控制多按钮
效果图: 效果描述: 1.当点击 1 按钮后,进入选择城市的页面,会监听到你选中的城市名称:动态为Spinner绑定数据 2.当点击 2 按钮后,进入自动查询数据页面,只要输入首字母,就会动态查找以该 ...