边猿 2023-01-18 15:32 采纳率: 50%
浏览 63
已结题

第2题 放书(noip2008mn)

第2题 放书(noip2008mn)
作为一名图书管理员,每天结束时你要把书放回书架。书架和堆放书的地方可以认为在一个X轴上,堆书的地点坐标为0,书架的位置在正、负整数点上。你开始的位置就在0点,你一次最多可以拿N本书,问你最少要走多少路程才可以把书全部放回各自的书架上。

输入格式
第一行有两个整数K和N, 1<=K,N <=50,分别代表书本总数和你一次最多可拿的书本数。后面有K个整数(在-10000到10000之间),分别表示每本书所要放回书架的位置。

输出格式
最少需要的路程。注:你最后可以停在任意的位置,不必返回到开始位置。

输入/输出例子1
输入:

7 2

-37 2 -6 -39 -29 11 -28

输出:

131

输入/输出例子2
输入:

8 3

-18 -9 -4 50 22 -26 40 -45

输出:

158

  • 写回答

2条回答 默认 最新

  • ksgpjhqf 2023-01-18 20:36
    关注

    移动距离最少,需要每次将最远的同方向的N本书放到合适位置,当两侧书本数量都小于N时,跑两趟分别把两侧的书放到合适位置。因为不需要回到原来的地方,再减去最远的书的距离。
    c++代码:

    
    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    template <typename T>
    T max(T& a, T& b) {
        return a < b ? b : a;
    }
    
    int main() {
        int k, n, i, j, s = 0;
        cin >> k >> n;
        vector<int> v(k);
        for (i = 0; i < k; i++) {
            cin >> v[i];
        }
        sort(v.begin(), v.end());
        for (i = 0; v[i] <= 0; i++);
        for (j = 0; j < i; j++) {
            if (j % n == 0) {
                s -= v[j] * 2;
            }
        }
        for (j = v.size(); j > i; j--) {
            if ((v.size() - j) % n == 0) {
                s += v[j - 1] * 2;
            }
        }
        s -= max(-v.front(), v.back());
        cout << s;
        return 0;
    }
    

    执行结果:

    img

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

报告相同问题?

问题事件

  • 系统已结题 5月30日
  • 已采纳回答 5月22日
  • 创建了问题 1月18日

悬赏问题

  • ¥15 vs2022运行C++,无法打开头文件
  • ¥15 C# PrintDocument 80 热敏打印机 , 顶部空间如何缩小
  • ¥15 Win10编码错误导致代码符号出现
  • ¥15 tensorflow在特定账户下不可用
  • ¥15 JavaScript 修改 chrome 上 传感器的经纬度
  • ¥15 关于#java#的问题:怎么通过ffmpeg把第一个文件的后30秒、第二个文件全部、第三个文件前30合并到一起怎么通过ffmpeg把第一个文件的后30秒、第二个文件全部、第三个文件前30合并到一起
  • ¥15 求推荐发表需要付费的深度学习遥感场景分类SCI期刊
  • ¥15 VESTA绘图原子颜色显示异常
  • ¥15 天翼云搭建多ip l2tp
  • ¥15 python实现CAD识图