菜喵一只 2023-07-26 04:29 采纳率: 60%
浏览 131
已结题

[CSP2020 山东小学组]勇敢的津津

[CSP2020 山东小学组]勇敢的津津
津津是个勇敢的人,总是做一些挑战自己的事情。
一天津津来到一条宽为 L 米的小河边,河道的一边到另一边需要途径 N 块较大的石墩,每块石墩到这一边岸边之间距离 xi 米(石墩不占距离,只考虑石墩的中间点到这一边岸边之间距离)。
津津想踩着这些石墩从小河的这一边跳到另一边(不落入水中),一次可以跳过几块石墩。
已知津津每次最多跳 M 米的距离,那么津津最少跳几次就能从这一边跳到另一边?
输入描述
第一行包含三个整数 L,N, M,分别小河的宽度、石墩数和津津跳的最远距离。
接下来 N 行,每行一个整数,第 i 行的整数 di( 0 <di < L), 表示第 i 块石墩与这一边岸边的距离,保证石墩之间的距离和石墩到这一边岸边的距离小等于 M。这些石墩按与起点距离从小到大的顺序给出,且不会有两个石墩出现在同一个位置。
输出描述
一个整数,即最少的跳跃次数。
样例输入 1
10 4 2
2
4
6
8
样例输出 1
5
样例输入 2
25 5 10
2
11
14
17
21
样例输出 2
4
提示
【样例解释】
样例一:津津可以从岸边跳到距离为 2 石墩上,然后跳到距离为 4 的石墩上,再跳到距离为 6 的石墩上,再跳到距离为 8 的石墩上,最后跳的对岸。总共 5 跳跃。

样例二:津津可以从岸边跳到距离为 2 石墩上,然后跳到距离为 11 的石墩上,再跳到距离为 21 的石墩上,最后跳的对岸。总共 4 跳跃。
【数据范围】
对于 30% 的数据,1≤N≤10。
对于 50% 的数据,1≤N≤100。
对于 100%的数据,1≤N≤500,1≤M,L≤1,000,000。

展开全部

  • 写回答

2条回答 默认 最新

  • 藏柏 2023-07-26 04:32
    关注
    
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int min_jumps(int L, int N, int M, vector<int>& distances) {
        sort(distances.begin(), distances.end());  // 将石墩的距离按与起点的距离从小到大排序
        int cur_pos = 0;
        int steps = 0;
    
        for (int i = 0; i < N; i++) {
            int diff = distances[i] - cur_pos;  // 当前石墩与起点的距离
            if (diff <= M) {
                cur_pos = distances[i];  // 可以直接跳到该石墩上
                steps++;
            } else {
                int max_dist = 0;
                int next_pos = cur_pos;
                for (int j = cur_pos; j < distances[i]; j++) {
                    int dist = j - cur_pos;  // 计算当前位置与当前石墩的距离
                    if (dist <= M && dist > max_dist) {
                        max_dist = dist;
                        next_pos = j;
                    }
                }
    
                cur_pos = next_pos;
                steps++;
            }
        }
    
        return steps;
    }
    
    int main() {
        // 样例输入 1
        int L1 = 10, N1 = 4, M1 = 2;
        vector<int> distances1 = {2, 4, 6, 8};
        cout << min_jumps(L1, N1, M1, distances1) << endl;  // 输出 5
    
        // 样例输入 2
        int L2 = 25, N2 = 5, M2 = 10;
        vector<int> distances2 = {2, 11, 14, 17, 21};
        cout << min_jumps(L2, N2, M2, distances2) << endl;  // 输出 4
    
        return 0;
    }
    
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 9月23日
  • 已采纳回答 9月16日
  • 创建了问题 7月26日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部