CF709B 题解

洛谷链接&CF 链接

本篇题解为此题较简单做法较少码量,并且码风优良,请放心阅读。

1|0题目简述

给定 N 个点,在一条数轴上,位置为 x1,,xn,你的位置为 p,你要经过 N1 个点,求至少要走的距离。

2|0思路

首先因为输入是乱序的,所以需要由小到大排序

又因为需要经过 N1 个点,所以要么不走左端点,要么不走右端点,这样分两种情况讨论,分别求出答案取 min 即可。

首先分析情况 1,要么 pa2an,要么 a2pan,要么 a2anp第二种不论先去 a2 还是 an 结果都一样。所以不讨论,第一三种需要讨论一下,对于第一种一定是先去 a2 结果最小, 对于第三种一定是先去 an 结果最小,只需对这两种分别处理最后取 min 即可,由此分析可得这种情况的方程式为:

min(|anp|+|ana2|,|a2p|+|ana2|)

同样分析可得情况 2方程式

min(|an1p|+|an1a1|,|a1p|+|an1a1|)

最后对两种情况取 min 即可。

经过以上分析,很容易即可得出代码了:

#include<iostream> #include<algorithm> using namespace std; int n, a[100005], p; long long ans = 0x3f3f3f3f; // 要取 min 所以需初始化一个较大数 int min(int x, int y) { return (x < y) ? x : y; } int abs(int x) { return (x > 0) ? x : -x; } int main(){ cin >> n >> p; if(n == 1) { cout << "0\n"; return 0; } // 特判 for(int i = 1; i <= n; i ++) cin >> a[i]; sort(a + 1, a + n + 1); // 因为是乱序,所以需要排序 long long num1 = 0, num2 = 0; // 可不开 long long // 情况 1 num1 = min(abs(a[n] - p) + abs(a[n] - a[2]), abs(a[2] - p) + abs(a[n] - a[2])); // 情况 2 num2 = min(abs(a[n - 1] - p) + abs(a[n - 1] - a[1]), abs(a[1] - p) + abs(a[n - 1] - a[1])); ans = min(num1, num2); // 答案取 min cout << ans << endl; // 输出,换行好习惯 return 0; }

提交记录:

SonoSlack

The End!


__EOF__

本文作者So_noSlack
本文链接https://www.cnblogs.com/So-noSlack/p/17587202.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   So_noSlack  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示