首页 > 其他分享 >洛谷 P1889 士兵站队

洛谷 P1889 士兵站队

时间:2023-09-19 13:55:38浏览次数:45  
标签:洛谷 P1889 int res ++ 站队 移动 步数

洛谷 \(P1889\) 士兵站队

问题简述

这道题我们可以换另一种思路去看待它,就容易理解了:

在一个平面上,把 \(n\) 个点排列在一条与 \(x\) 轴平行的直线的整点上,且相邻两点的距离为 \(1\) 。

求一种排列方案,使得这\(n\) 个点到目标位置的 曼哈顿距离和最小

解法综述

由于是求曼哈顿距离,所以可以将 \(x\) ,\(y\) 分开考虑。

首先,要找到最优的一列(使移动步数最少的一列),其实就是要找一条平行于\(x\)轴的直线,设此直线为\(y=k\),那么,每个点到这条线距离为\(|y_i-k|\),不难发现,当\(k\)是所有点纵坐标的中位数时,距离之和最小。

找到了这条直线之后,又该把每个点移到哪个位置才能使结果最优呢?

可以设最左边的点(第一个点)移动后的位置为\(b\),因为所有点必须排在一条线段上,那么第二个点的移动后的位置即为\(b+1\),第三个移动后的位置为\(b+2\)......以此类推,第\(n\)个点移动后的位置为\(b+n-1\)。

那么横向移动的步数之和为\(|x_0-b|+|x_1-b-1|+|x_2-b-2|+......+|x_{n-1}-b-n+1|\),所以,要使步数之和最小,只需要 再找一次中位数 即可。

\(Code\)

#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
int x[N], y[N];

int n, res;
int main() {
    cin >> n;
    for (int i = 0; i < n; i++) cin >> x[i] >> y[i];

    sort(y, y + n);
    sort(x, x + n);

    for (int i = 0; i < n; i++) res += abs(y[i] - y[n / 2]); // 对与x轴的一条平等线的最短距离和

    for (int i = 0; i < n; i++) x[i] -= i;

    sort(x, x + n);
    for (int i = 0; i < n; i++) res += abs(x[i] - x[n / 2]);

    // 输出
    cout << res << endl;
    return 0;
}

标签:洛谷,P1889,int,res,++,站队,移动,步数
From: https://www.cnblogs.com/littlehb/p/17714423.html

相关文章

  • 洛谷:manacher
    【模板】manacher算法题目描述给出一个只由小写英文字符\(\texttta,\textttb,\textttc,\ldots\texttty,\textttz\)组成的字符串\(S\),求\(S\)中最长回文串的长度。字符串长度为\(n\)。输入格式一行小写英文字符\(\texttta,\textttb,\textttc,\cdots,\textt......
  • 洛谷P4316 绿豆蛙的归宿(期望dp)
    原题链接:https://www.luogu.com.cn/problem/P4316这题是经典的概率dp题,通常看到的题解都是逆推的做法,实际上理解了题目的含义后发现逆推其实是正推的一种特殊情况而已正推做法:定义dp[i]表示从1~i的路径长度的期望,那么dp[1]=0,答案就是dp[n]状态转移公式://u->vdp[v]=(d......
  • 洛谷题解 | P1046 陶陶摘苹果
    ​目录题目描述输入格式输出格式输入输出样例说明/提示题目思路AC代码题目描述陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现......
  • 洛谷P5707 【深基2.例12】上学迟到
    题目描述学校和yyy的家之间的距离为 ss 米,而yyy以 vv 米每分钟的速度匀速走向学校。在上学的路上,yyy还要额外花费 1010 分钟的时间进行垃圾分类。学校要求必须在上午 \textrm{8:00}8:00 到达,请计算在不迟到的前提下,yyy最晚能什么时候出门。由于路途遥远,yyy可......
  • 洛谷 P9518 queue
    一眼模拟。需要维护的东西可以根据操作求得:start:正在玩游戏的\(1\)或\(2\)个人;arrive:当前在排队但没玩游戏的队列、每个人是否在排队、游玩;leave:每个人是否在排队、游玩。如何维护正在玩游戏的人:我们使用\(p_1\)、\(p_2\)两变量存储,优先保证\(p_1\)有值,当\(p_1......
  • 洛谷OJ [P5018 对称二叉树] (深度优先搜索、二叉树、思维)
    P5018[NOIP2018普及组]对称二叉树题意:给定一棵树,树上的每个结点有一个权值,问你这棵树的子树中节点数最多的对称二叉树的节点数是多少?对称二叉树的定义如下:对于树中的每一个结点,要么没有子节点,要么既有左儿子,又有右节点,且对称位置的结点点权相等。输入格式:第一行......
  • 【dfs基础题】洛谷P1219题解
    题目大意给定棋盘的规格为\(n×n\),现在要摆\(n\)个皇后,使得每个皇后不能互相攻击。题目解答由题意可知,如果两个皇后在同一行或同一列或同一对角线,那么就会互相攻击。那么就简单了,若当前要摆的是第\(i\)个皇后,那么只需要for循环一遍前面的\(i-1\)个皇后,判断前面的皇后......
  • 洛谷[P1305 新二叉树] Tag:二叉树、基础数据结构
    P1305新二叉树题目描述:输入一串二叉树,输出其前序遍历。输入格式:第一行为二叉树的节点数$n(1\len\le26)$,后面\(n\)行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。空节点用*表示输出格式:二叉树的前序遍历。思路:对......
  • 洛谷 CF707C Pythagorean Triples の 题解
    这道题是一道数论题,不可用暴力通过,因为输入范围极大,基本上循环是不能在这道题上使用的了。前面大佬们讲的我听不懂,于是在教练的帮助下,我利用题面给出的多组样例找到了规律。在此之前,我们先设输入的数为\(n\)。\(n\)分三种情况。\(n\)是奇数;\(n\)是偶数;\(n\)小于等于......
  • 洛谷 P9503『MGOI』Simple Round I | B. 魔法照相馆 の 题解
    这道题是一道模拟题,坑点不多,但是细节特多,所以导致大部分人\(A\)不了这道题。这道题我也写了注释,如果思路没明白可以看代码和注释的。先创建一个长度为\(3\)的字符串\(s1\),这个字符串的意思就是模拟现在的这几个幕布的情况,这里分了四个字符代表着四种情况,详细如下该字符串......