Codeforces Gym101246J:Buoys(三分搜索)
2024-09-01 00:47:34
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 ;
}
最新文章
- centos网卡eth1变成eth0修改方法
- Windows 8.1 应用再出发 (WinJS) - 几种新增控件(2)
- mysql根据时间查询前一天数据
- win8 任务栏不合并隐藏标题
- [jobdu]二叉树的镜像
- 深入理解Java的protected修饰符
- 射频识别技术漫谈(19)——Desfire的3次握手认证和段密码生成
- JS中的事件大全
- winform打开本地html页面
- HDU1754-ZKW线段树
- new 和 newInstance 的区别
- unittest的使用一
- Linux系统安全学习笔记(1)-- 文件系统类型
- ESXi 6.5 总是会话超时
- Linux基础命令---findfs
- Python 列表 pop() 方法
- PCB中的SOLD MASK和阻抗开窗
- Xamarin Visual Studio不识别JDK路径
- oracle xe远程访问
- BNU29140——Taiko taiko——————【概率题、规律题】
热门文章
- sql 循环 随机数创建数据
- SDL(01-10)
- WPF:如何为程序添加splashScreen?
- 图像滤镜艺术---挤压(Pinch)滤镜
- block-chain java source
- Win10《芒果TV》商店版更新v3.2.2:新增对Win10产品专用会员兑换码支持,全新的最具价值用户纪念奖励
- UWP项目生成错误: 未能使用“CompileXaml”任务的输入参数初始化该任务。“CompileXaml”任务不支持“PlatformXmlDir”参数。请确认该参数存在于此任务中,并且是可设置的公共实例属性。
- 《解读window核心编程》 之 进程
- delphi xe5 中TMemo控件的应用——for android
- 每天进步一点--WCF学习笔记