Codeforces Gym101246J:Buoys(三分搜索)
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 ;
}
Codeforces Gym101246J:Buoys(三分搜索)的更多相关文章
- Weakness and Poorness CodeForces - 578C 三分搜索 (精度!)
You are given a sequence of n integers a1, a2, ..., an. Determine a real number x such that the weak ...
- hdu 4355 Party All the Time(三分搜索)
Problem Description In the Dark forest, there is a Fairy kingdom where all the spirits will go toget ...
- 三分搜索-ZOJ LightBulb
开始算法基础学习的第一天 今天学习的内容是三分搜索 相对来说很基础的内容(还是觉得脑子不够用) 三分搜索主要用于凸函数查找极大值. (盗个图) 如图所示 若要查找该函数的最大值 可以考虑和二分法一样的 ...
- Codeforces 782B:The Meeting Place Cannot Be Changed(三分搜索)
http://codeforces.com/contest/782/problem/B 题意:有n个人,每个人有一个位置和速度,现在要让这n个人都走到同一个位置,问最少需要的时间是多少. 思路:看上去 ...
- Codeforces 799D Field expansion - 搜索 - 贪心
In one of the games Arkady is fond of the game process happens on a rectangular field. In the game p ...
- Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D) - 记忆化搜索
Palindromic characteristics of string s with length |s| is a sequence of |s| integers, where k-th nu ...
- Codeforces C. NP-Hard Problem 搜索
C. NP-Hard Problem time limit per test:2 seconds memory limit per test:256 megabytes input:standard ...
- Codeforces 939E Maximize! (三分 || 尺取)
<题目链接> 题目大意:给定一段序列,每次进行两次操作,输入1 x代表插入x元素(x元素一定大于等于之前的所有元素),或者输入2,表示输出这个序列的任意子集$s$,使得$max(s)-me ...
- CodeForces - 1059D——二分/三分
题目 题目链接 简单的说,就是作一个圆包含所有的点且与x轴相切,求圆的最小半径 方法一 分析:求最小,对半径而言肯定满足单调性,很容易想到二分.我们二分半径,然后由于固定了与X轴相切,我们对于每一个点 ...
随机推荐
- VoIP应用在Ubuntu 14.04下编译FFmpeg libX264及PJSIP
PJSIP是一个开源的SIP协议栈.它支持多种SIP的扩展功能,可说算是最目前流行的SIP协议栈之一了. 它实现了SIP.SDP.RTP.STUN.TURN和ICE.PJSIP作为基于SIP的一个多 ...
- springboot使用logback日志,部署到tomcat不生效问题解决
1.springboot 配置日志方法 使用该方法配置日志,在本地调试可以正常写入日志文件,但是打包发布到tomcat以后日志配置不生效. 2.修改配置 Spring Boot官方推荐优先使用带有-s ...
- 2-17-MySQL读写分离-mysql-proxy
实验环境: mysql-proxy服务端: xuegod1 IP:192.168.10.31 mysql服务器(主,负责写)服务端:xuegod2 ...
- EF 两种删除方式的比较
UserInfo user = from u in context.UserInfo where u.Id=343 select u; context.UserInfo.Remove(user); 用 ...
- 待修 Bug
# 乱码 ## 描述 环境:Tomcat 8 + Spring 4 + Spring Security. 问题描述: 在类 AbstractAnnotationConfigDispatcherServ ...
- liunx 查看php 安装的扩展
/usr/local/php5/bin/php -i |less 查看配置文件在哪里,编译参数 /usr/local/php5/bin/php -m |less 查看php加载的模块
- VS2010调试X86汇编程序
今天突然无聊了一下,想起之前想的用VS来调试汇编程序.之前只是想了一下,没有去做,好吧,今天搜索一下,找到了一个教程,相当的详细具体,我喜欢 按照http://blog.csdn.net/jinson ...
- QT---Winsocket获取网关(Gateway) 主机IP等信息
基于WinPcap库做开发,需要利用到局域网的默认网关地址和Mac地址,但是WinPcap实现获取网关IP地址没有很好的思路,可以知道的是网关的接收和发出的数据包数量一般是比局域网内的各主机要多的 ...
- PNG透明窗体全攻略(控件不透明)
http://blog.csdn.net/riklin/article/details/4417247 看好了,这是XP系统,未装.net.我的Photoshop学的不太好,把玻璃片弄的太透了些,如果 ...
- QThread多线程编程经典案例分析(三种方法,解释了为什么使用moveToThread的根本原因,即为了避免调用QThread::exec() )
传统的图形界面应用程序都只有一个线程执行,并且一次执行一个操作.如果用户调用一个比较耗时的操作,就会冻结界面响应. 一个解决方法是按照事件处理的思路: 调用 Void QApplication::pr ...