题目:

在一条直线上,与两个点距离之和最小的点,是怎样的点?

很容易想到,所求的点在这两个已知点的中间,因为两点之间距离最短。

在一条直线上,与三个点距离之和最小的点,是怎样的点?

由两个点的规律,我们可以想到,所求点一定夹在这些点中间。

例如 :  -3    0    10

我们先试探一下

取点0:  |0-3|+|0-0|+|0-10| = 3+0+10 = 13

取点-1: |-1-(-3)|+|-1-0|+|-1-10| = 2+1+11 = 3+1+10 = 14

取点1 :    |1-(-3)|+|1-0|+|1-10| = 4+1+11 = 3+1+10 = 14

取点-3:    |-3-(-3)|+|(-3)-0|+|-3-10| = 0+3+13 = 3+3+10 = 16

取点10:   |10-(-3)|+|10-0|+|10-10| = 13+10+0 = 3+10+10 = 23

我们可以观察到取点0时结果最小,取其他点会多算一些部分。

我们可以想到取中间的点的时候,距离最小。

如果有偶数个点的话,取介于中间两个点的任何一个点即可。左闭右闭[]。

这个从两个点的时候就可以看出端倪。

如果还是不清楚的话,多画几个图就出来了。

代码:

#include <bits\stdc++.h>
using namespace std;
typedef long long ll; int n; int a[];
int main() {
int n;
cin >> n;
for(int i = ;i <= n; i++){
cin >> a[i];
}
sort(a+,a+n+); //如果n是奇数,index表示中间的点.
//如果是偶数,则表示中间两点中右边的那个点 。
int index = n/+; ll ans = ;
for(int i = ;i <= n; i++){
ans += abs(a[i]-a[index]);
}
cout << ans << endl;
return ;
}

最新文章

  1. C#常用类笔记
  2. ruby HTTPS请求
  3. MYSQL select查询练习题
  4. JavaScript——callback(回调函数
  5. [转][Unreal3教程]引擎使用操作入门教程
  6. CORS 跨域 实现思路及相关解决方案
  7. Django - staticfiles,STATIC_ROOT, STATIC_URL,STATICFILES_DIRS
  8. webview的配置
  9. Android Handler Leak
  10. yum 简介及使用 安装、删除
  11. having在Oracle和mysql小点不同
  12. fatal error C1083: 无法打开包括文件: “SDKDDKVer.h”: No such file or directory(转)
  13. Netty+SpringBoot写一个基于Http协议的文件服务器
  14. Maven的下载,安装,配置,测试,初识以及Maven私服
  15. [AGC025B]RGB Coloring
  16. Echarts动态加载柱状图和折线图混合展示的实例
  17. BLIST,BindingSource
  18. ZK Leader选举
  19. execute immediate
  20. DataStage系列教程 (Slowly Changing Dimension)缓慢变化维

热门文章

  1. 新手配置vux
  2. Java基础——Servlet
  3. nodejs+express搭建服务器
  4. Java简述
  5. [USACO17FEB] Why Did the Cow Cross the Road I P (树状数组求逆序对 易错题)
  6. POJ 1743 [USACO5.1] Musical Theme (后缀数组+二分)
  7. 实战:vue项目中导入swiper插件
  8. angular-输入验证
  9. map和multimap映射容器
  10. poj2492--A Bug&amp;#39;s Life(并查集变形)