题目
水下探测器可以潜入湖中在任意水深进行科学探索。湖水的最大深度为 h 米,即它在湖底时到水面的距离,0<=h<=100;探测器最初的水下深度为 s 米,0<=s<=100;当探测器不在水面(当前深度大于 0)时,每个 u 指令可使它上浮 1 米,而当探测器在水面时,u 指令是无效的;当探测器不在湖底(当前深度小于 h)时,每个 d 指令可使它下沉 1 米,而当探测器在湖底时,d 指令是无效的;在执行到无效指令时,探测器不做任何操作而继续执行下一指令。
编程实现:?
根据给定的 h、s 和一个指令序列(由字符 u、d 组成的字符串,长度不超过 100),求出执行完整的指令序列后,探测器的水下深度。
?输入:
第一行:h 和 s,以空格分开。0<=s<=h<=100
第二行:长度不超过 100 的指令字符串,串中仅包含字母 u 或 d
输出:?
代表探测器在执行指令后的水下深度的数字。
【样例输入】:
9 1
uduudd
【样例输出】:
2
样例数据分析:?
水深9米,探测器在水下1米处,
字符u代表向上1米,探测器上浮到0米处
字符d代表向下1米,探测器下沉到1米处
字符u代表向上1米,探测器上浮到0米处
字符u代表向上1米,探测器已经在水面,不能上浮,依然在0米处
字符d代表向下1米,探测器下沉到1米处
字符d代表向下1米,探测器下沉到2米处
最终结果为2
感想 :
我知道这里一定有许多大佬,如果我哪里说的有问题,请大佬勿喷。
在发文章之前我也看了许多关于这道的解答,大多数都写得是for(int i=0;i<***.size();i++),其实这是一个很糟糕的写法,如果说字符串长度小的话,这样写没有任何问题,但是如果说非常长的字符串的话,没循环一次就要执行一次.size(),这无疑拉低了效率,所以我对其进行了一些改进。
随后的话,我说说我编译这道题时遇到的错误吧。(这么简单的题都还编译错了,太丢人了)
因为没仔细看题目,所以最开始写判断的时候写出了这样
if(a[i]=='u'&&s>=0)
s--;
else if(a[i]=='d'&&s<=h)
s++;
运行了一编发现不对,然后又都了一遍题改出来了,希望大家不要像我一样马马虎虎的读题。
这道题的思路相信大家都有,我就直接上源码了(有不懂的可以私信我,但我不一定会回)
源码:
#include <iostream>
using namespace std;
int main()
{
string a;//(纯属个人观点)string型比char好用
int h,s,num;
cin>>h>>s>>a;//输入数据
num=a.size();//这里先计算出数组长度,写在for效率会下降
for(int i=0;i<num;i++)
{
if(a[i]=='u'&&s>0/*判断是否在水面*/)
s--;
else if(a[i]=='d'&&s<h/*判断是否在水低*/)
s++;
}
cout<<s;//输出
}
|