原题链接:贝茜的训练
解题思路: 其实题目并不难,只要思路对了,代码其实很简单。

红线表示山路,蓝色表示上山,灰色表示下山,很明显,上山时如果是上坡,那么下山时就变成了下坡;上山时如果是平地,下山时也是平地;上山时如果是下坡,那么下山时就变成了上坡。某一段路T,要么不走,要么走就得来回走两趟,所以解题思路就是一段一段的检查,例如上山第一段是D,下山就是U,如果D+U的时间没有超过M,就说明这一段路是可以走的,而且走也是能在规定时间內返回的,再去看下一段,上山是D,下山是U,如果第一段的上下山时间加上这时的D+U仍旧没有超过M,那么第二段也可以走,如果超过了M,那就说明这一段不能走,否则即便是上山时时间不超,下山时时间也一定会超,所以这一段就不能走,必须立刻掉头下山....依此类推,循环直到第i段时上、下山时间超出了M就结束循环,总共走了i-1段。
参考代码:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
int M = 0, T = 0, U = 0, F = 0, D = 0;
scanf("%d %d %d %d %d", &M, &T, &U, &F, &D);
char roadCondition[T];//T段路的路况
getchar();//吸收回车
for (int i = 0; i < T; ++i) {
scanf("%c", &roadCondition[i]);//输入上山的路况
getchar();//吸收回车
}
int totalTime = 0;//上山来回一趟所需的总时间
int miles = 0;
for (int i = 0; i < T; ++i) {
/*
* 上山时是上坡,那么下山时一定就是下坡,
* 而且上山和下山是绑定在一起的,有上山就一定会有下山
*/
if (roadCondition[i] == 'u') {
if (totalTime + U + D <= M) {//如果上山+下山时间不超过奶牛进山的时间
totalTime += U + D;
miles ++;//路段加1
continue;
} else {//加上这一段已经超时,这一段不能加,必须折头返回,结束循环,
break;
}
}
if (roadCondition[i] == 'f') {
if (totalTime + F + F <= M) {
//加上这一段不超时
totalTime += F + F;
miles++;
continue;
} else {
//加上这一段已经超时,这一段不能加,必须立刻折头返回,结束循环,
break;
}
}
if (roadCondition[i] == 'd') {
if (totalTime + D + U <= M) {
//加上这一段不超时
totalTime += U + D;
miles++;
continue;
} else {
//加上这一段已经超时,这一段不能加,得折头返回,结束循环,
break;
}
}
}
printf("%d\n", miles);
return 0;
}0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复