http://codeforces.com/gym/101246/problem/J

题意:给出n个点坐标,要使这些点间距相同的话,就要移动这些点,问最少的需要的移动距离是多少,并输出移动后的坐标。

思路:昨晚比赛确定的一点就是通过X分搜索去枚举间距,使得最后的移动距离最短。

不过使用的是二分,而且写的时候也只枚举了起点和终点,后面想了要枚举所有的点,但时间来不及。

因为间距的单调不会使得答案单调,间距过大过小都会使得最后的移动距离不是最优,所以是使用三分而不是二分,顺便重温一下三分。

     while(fabs(r - l) > eps) {
double mid = (l + r) / 2.0;
double midd = (mid + r) / 2.0;
if(cal(mid, ) > cal(midd, )) l = mid;
else r = midd;
}
double ans = cal(l, ) > cal(r, ) ? r : l;

对于每次三分,每次在n个点里面假设一个点不动,然后枚举完算一遍,取最优。

而且据说挺卡精度的,直接开了1e-12.

 #include <bits/stdc++.h>
using namespace std;
#define N 405
const double eps = 1e-;
double num[N];
int n, id; double cal(double x, int flag) {
double res = , ans = ;
for(int st = ; st <= n; st++) {
res = ;
for(int i = ; i < st; i++)
res += fabs(num[st] - (st - i) * x - num[i]);
for(int i = st + ; i <= n; i++)
res += fabs(num[st] + (i - st) * x - num[i]);
if(ans > res) ans = res, id = st;
}
return ans;
} void solve() {
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%lf", &num[i]);
double l = , r = ;
while(fabs(r - l) > eps) {
double mid = (l + r) / 2.0;
double midd = (mid + r) / 2.0;
if(cal(mid, ) > cal(midd, )) l = mid;
else r = midd;
}
double ans = cal(l, ) > cal(r, ) ? r : l;
double res = cal(ans, );
printf("%.4f\n", res);
for(int i = ; i < id; i++)
printf("%.10f ", num[id] - (id - i) * ans);
printf("%.10f ", num[id]);
for(int i = id + ; i <= n; i++)
printf("%.10f ", num[id] + (i - id) * ans);
} int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
solve();
return ;
}

最新文章

  1. centos网卡eth1变成eth0修改方法
  2. Windows 8.1 应用再出发 (WinJS) - 几种新增控件(2)
  3. mysql根据时间查询前一天数据
  4. win8 任务栏不合并隐藏标题
  5. [jobdu]二叉树的镜像
  6. 深入理解Java的protected修饰符
  7. 射频识别技术漫谈(19)——Desfire的3次握手认证和段密码生成
  8. JS中的事件大全
  9. winform打开本地html页面
  10. HDU1754-ZKW线段树
  11. new 和 newInstance 的区别
  12. unittest的使用一
  13. Linux系统安全学习笔记(1)-- 文件系统类型
  14. ESXi 6.5 总是会话超时
  15. Linux基础命令---findfs
  16. Python 列表 pop() 方法
  17. PCB中的SOLD MASK和阻抗开窗
  18. Xamarin Visual Studio不识别JDK路径
  19. oracle xe远程访问
  20. BNU29140——Taiko taiko——————【概率题、规律题】

热门文章

  1. sql 循环 随机数创建数据
  2. SDL(01-10)
  3. WPF:如何为程序添加splashScreen?
  4. 图像滤镜艺术---挤压(Pinch)滤镜
  5. block-chain java source
  6. Win10《芒果TV》商店版更新v3.2.2:新增对Win10产品专用会员兑换码支持,全新的最具价值用户纪念奖励
  7. UWP项目生成错误: 未能使用“CompileXaml”任务的输入参数初始化该任务。“CompileXaml”任务不支持“PlatformXmlDir”参数。请确认该参数存在于此任务中,并且是可设置的公共实例属性。
  8. 《解读window核心编程》 之 进程
  9. delphi xe5 中TMemo控件的应用——for android
  10. 每天进步一点--WCF学习笔记