前言
今天的第一题也挺有意思,就拿它来练练。希望能经常看到这么有意思的练习题,少出神描述…
这题纯粹就是逻辑思维问题了,我没想到数学算法,就暴力模拟了一把,很快就解出来了。
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目
题目描述:
小海豚喜欢打游戏,现在它在操纵游戏人物小C逃脱废弃的隧道,逃生装置在小C的前方 X 米远的位置。但是游戏机只有两个按钮:前进和后退,按前进,小C会前进 m 米,按后退,小C会后退 n 米。 小海豚必须设法把小C送到逃生装置上,方能逃离隧道,请你帮帮小海豚,告诉它至少要操作多少次,才能通关。
输入描述:
输入三个正整数X、m和n
输出描述:
输出一个整数,表示小海豚通关需要操作的次数
示例:
输入
5 77 157
输出
73
二、解题分析
我估计是有数学算法能解决这问题的,但咱小学数学没学好。
而且对计算机来说,加减法的运算速度是最快的!如果只用加减法,不会比数学公式一步算出来慢到哪去!因为加减法会比乘法运算快10倍,比除法快20倍。
最重要的是这题用模拟太容易写代码了,而且很优雅!
三、代码
代码如下(示例):
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
int solution(int X, int m, int n){
int result=0;
// TODO:
int up=0, down=0; //没操作按键时的初始值,前进0,后退0
while (up-down!=X){
if (up-down < X){
up += m; //当没到达出口时,按前进
result++;
}else{
down += n; //当超过出口时,按后退
result++;
}
}
return result;
}
int main() {
int X;
int m;
int n;
std::cin>>X;
std::cin>>m;
std::cin>>n;
int result = solution(X, m, n);
std::cout<<result<<std::endl;
return 0;
}
老是提示让我改进此文质量,又突然来了点灵感,我想到了一个稍微有点数学味的办法来解题了:
很明显设设置二个变量 i,j,i 代表前进的次数,j 代表后退的次数,那么设立一个条件:im - jn == 30,不足30加i,超过30加j,等于了就把i和j相加,就能解出来了,虽然逻辑没变,可这样不就很有点数学味了嘛…
总结
最重要的一点:题中的X是大写的!为这报了我几次没申明变量的错。
解题思路简单来说:就是没到出口时按一下前进键,还没到就再按前进,超过出口了就按后退,退多了又前进。这代码和玩游戏过程一模一样!我还是喜欢这个写法。