zoukankan      html  css  js  c++  java
  • 「贪心」士兵

    士兵

    原题链接:士兵

    题目大意

    在一个坐标轴上,给很多坐标,现在要让这些坐标的 y 值相同 x 值不同,求移动的最少距离

    题目题解

    和上一篇题解很像,我们这里将 (x, y) 单独拿出来考虑,(y) 我们可以直接用中位数计算,但是 (x) 还要考虑是否有点已经占领过了,这里可以有更好的方式就是,(x) 就算转移后,他们的位置关系是不变的,那么我们就可以将每个 (x_i) 都减一个 i 这样我们就能够直接用中位数计算了

    详细见代码

    //#define fre yes
    
    #include <cstdio>
    #include <algorithm>
    
    const int N = 10005;
    int x[N], y[N];
    
    int main() {
        static int n;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%d %d", &x[i], &y[i]);
        }
        
        std::sort(x + 1, x + 1 + n);
        std::sort(y + 1, y + 1 + n);
        
        for (int i = 1; i <= n; i++) {
            x[i] -= i;
        } std::sort(x + 1, x + 1 + n);
        midx = x[(n + 1) >> 1];
        midy = y[(n + 1) >> 1];
        for (int i = 1; i <= n; i++) {
            ans += abs(x[i] - midx);
            ans += abs(y[i] - midy);
        } printf("%d
    ", ans);
        return 0;
    }
    
  • 相关阅读:
    友元函数
    异常处理
    RTTI
    接口类
    纯虚函数和抽象类
    虚函数与虚析构函数原理
    查看表空间使用率及shrink 表空间
    RAC fail over 测试
    js判断数组中是不是有某个元素
    layui 表格图片放大
  • 原文地址:https://www.cnblogs.com/Nicoppa/p/11524638.html
Copyright © 2011-2022 走看看