解题思路:    其实题目并不难,只要思路对了,代码其实很简单。

    屏幕快照 2021-02-16 上午10.41.54.png
    红线表示山路,蓝色表示上山,灰色表示下山,很明显,上山时如果是上坡,那么下山时就变成了下坡;上山时如果是平地,下山时也是平地;上山时如果是下坡,那么下山时就变成了上坡。某一段路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分

6 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区