您的位置:首页 > 娱乐 > 八卦 > web网页设计模板代码_官网创建_营销型网站方案_平台推广方案模板

web网页设计模板代码_官网创建_营销型网站方案_平台推广方案模板

2025/4/26 17:41:48 来源:https://blog.csdn.net/2402_87235067/article/details/147129680  浏览:    关键词:web网页设计模板代码_官网创建_营销型网站方案_平台推广方案模板
web网页设计模板代码_官网创建_营销型网站方案_平台推广方案模板

小蓝正在数轴上挖矿,数轴上一共有 n 个矿洞,第 ii 个矿洞的坐标为 ai​ 。 小蓝从 0 出发,每次可以向左或向右移动 1 的距离,当路过一个矿洞时,就会进行挖矿作业,获得 1 单位矿石,但一个矿洞不能被多次挖掘。小蓝想知道在移动距离不超过 m 的前提下,最多能获得多少单位矿石?

输入格式

输入的第一行包含两个正整数 n,m,用一个空格分隔。

第二行包含 n 个整数 -a1​,a2​,⋯,an​,相邻整数之间使用一个空格分隔。

输出格式

输出一行包含一个整数表示答案。

样例输入

5 4
0 -3 -1 1 2

样例输出

4

 解题思路

  1. 矿洞的坐标有正有负但是数组的下标没有负数,我们可以创建两个数组,分别存储正负的。
  2. 用前缀和减少计算量,注意前缀和数组要多开一个空间0。通过暴力枚举所有可能找最大值
  for(int i = 1;i <= m;i++){int sum = r[i];//向右走iif(m - 2*i > 0) sum += l[m-2*i];//剩下m-2*i向左走,因为要返回ans = max(ans,sum);//更新答案sum = l[i];if(m - 2*i > 0) sum += r[m-2*i];ans = max(ans,sum);//更新答案}

           3.在起点位置的矿单独计数,否则来回会加两次

        if(!pos) f++;cout << ans+f << endl;//f是0处的矿数量,单独列出,如果存到前缀和数组中会加两次
    

    完整代码

    #include <bits/stdc++.h>
    using namespace std;const int INF = 2e6+10;
    vector<int> r(INF,0);
    vector<int> l(INF,0);int main(){int n,m;cin >> n >> m;int ans = 0;int f = 0;for(int i = 0;i < n;i++){int pos = 0;cin >> pos;if(pos > 0) r[pos] += 1;else l[abs(pos)] += 1;if(!pos) f++;}l[0] = r[0] = 0;for(int i = 1;i <= m;i++){l[i] += l[i-1];r[i] += r[i-1];}for(int i = 1;i <= m;i++){int sum = r[i];//向右走iif(m - 2*i > 0) sum += l[m-2*i];//剩下m-2*i向左走,因为要返回ans = max(ans,sum);//更新答案sum = l[i];if(m - 2*i > 0) sum += r[m-2*i];ans = max(ans,sum);//更新答案}cout << ans+f << endl;//f是0处的矿数量,单独列出,如果存到前缀和数组中会加两次return 0;
    }

     

    版权声明:

    本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

    我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com