[蓝桥杯]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』网络操作API_上
简书翻译原文 卷积层 卷积操作是使用一个二维的卷积核在一个批处理的图片上进行不断扫描.具体操作是将一个卷积核在每张图片上按照一个合适的尺寸在每个通道上面进行扫描.为了达到好的卷积效率,需要在不同的通道 ...
- Attempting to use uninitialized value
ckpt = tf.train.get_checkpoint_state(FLAGS.model) if ckpt: saver.restore(sess, tf.train.latest_check ...
- 【转载】koa相关知识(来自官网)
什么是Koa? koa 是由 Express 原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的 Web 框架.使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重 ...
- Python基础综合练习
from turtle import * def draw(x): begin_fill() for i in range(5): forward(x) right(144) end_fill() d ...
- Android : 跟我学Binder --- (4) 驱动情景分析
目录: Android : 跟我学Binder --- (1) 什么是Binder IPC?为何要使用Binder机制? Android : 跟我学Binder --- (2) AIDL分析及手动实现 ...
- RSA加密及加签
1.对方要求我们的私钥是pkcs8格式,但是实际的公钥没有用pkcs8转换之后的私钥完成,所以是可以不是pkcs8的格式的.我们加签跟格式没有关系. 2.数据格式很重要,to_mpint而非crypt ...
- 用matlab生成mif文件
在FPGA中,rom模块的初始化文件分为两种,一种是hex文件,另外一种是mif文件,这两种文件都可以通过Quartus进行手工创建,进行手工输入数据,也可以借助于专用的文件编辑器完成编辑. 在此介绍 ...
- Android开发 ---基本UI组件8:九宫格布局、setOnItemClickListener()项被选中监听事件
效果图: 1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> ...
- python面向对象封装案例(附:is和==的区别)
面向对象封装案例 目标 封装 小明爱跑步 存放家具 01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对 ...
- 添加网络打印机的步骤(xp和win2008+win7)
1.如题,设置好打印机的 ip地址和子网掩码等信息. 2 .xp不像其他新的系统那么好用那么智能...只能慢慢来 如果是xp,注意,请添加网络打印机的时候选 :添加本地打印机,,记得哦 然后如图 然 ...