[蓝桥杯]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 ...
随机推荐
- 『TensorFlow』读书笔记_ResNet_V2
『PyTorch × TensorFlow』第十七弹_ResNet快速实现 要点 神经网络逐层加深有Degradiation问题,准确率先上升到饱和,再加深会下降,这不是过拟合,是测试集和训练集同时下 ...
- 菜鸟脱壳之脱壳的基础知识(四)——利用ESP定律来寻找OEP
.上节说的是单步跟踪法,这节讲的是利用堆栈平衡(ESP定律)来进行脱壳!想必大家都听说过ESP定律这个大名吧!ESP定律运用的就是堆栈平衡原理!一般的加壳软件在执行时,首先要初始化,保存环境(保存各个 ...
- PAT 1073 Scientific Notation
1073 Scientific Notation (20 分) Scientific notation is the way that scientists easily handle very ...
- Visual Basic 2017 操作Excel和word【1】持续更新……
我坚持在VB的路上走到黑………… 清单1.1 从应用程序对象导航到Excel中的工作表 Dim myWorkbooks As Excel.Workbooks = app.Workbooks ) ...
- spring+springMvc+struts的SSH框架整合
1.建立一个web项目 2.导入SSH框架所需jar包 3.配置web.xml文件 <?xml version="1.0" encoding="UTF-8" ...
- 查看selinux与关闭方法
查看当前用户selinux 状态 [root@o- ~]# getenforce Disabled [root@o- ~]# setenforce usage: setenforce [ Enforc ...
- 进程管理02 通过PEB枚举进程所有模块
0x01 结构探究 先在win7 x86下通过windbg来探究通过peb来得到进程模块的步骤: 命令!process 0 0 exeplorer.exe 先获取到explorer.exe的EPRO ...
- 网络知识梳理--OSI七层网络与TCP/IP五层网络架构及二层/三层网络(转)
reference:https://www.cnblogs.com/kevingrace/p/5909719.html https://www.cnblogs.com/awkflf11/p/9190 ...
- Hadoop学习笔记02_MapReduce练习
搭建好环境之后 ,就来跑个简单的Mapreduce试试看吧.这个比第一课难多了,需要多多练习并熟练掌握. 需要编写py脚本以及shell脚本, 所以需要学习Python和Linux的Shell编程. ...
- radhat 添加用户,组,shell,附加组,家目录
linux下强制踢掉登陆用户 查看机器中登陆的用户 [root@sunsyk ~]# w 16:29:02 up 2 days, 2:35, 5 users, load average: 0.03, ...