Gym 101246J Buoys(三分查找)
http://codeforces.com/gym/101246/problem/J
题意:
给定x轴上的n个点的坐标,按顺序从左到右给出,现在要使得每个点的间距相同,可以移动每个点的坐标,但是不能改变点的相对顺序。求总共最少需要移动多少距离和移动后点的坐标。
思路:
一开始想到用二分搜索,然后枚举一个点为不动点,但是这样我不知道该怎么去改变L、R的值了。。
仔细想想,这道题目所对应的模型图应该是这样的:

中间存在一点可以使移动距离最短,两边很大,因为间距设置的太小和太大都需要移动很多距离。这道题目可以用三分查找做。
三分查找是这样的:
MID=(L+R)/2, MMID=(MID+R)/2
接下去去计算MID和MMID这两个点所对应值,如果cla(MID)>cla(MMID),那么L=mid,否则的话,R=MMID。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn=+;
const double eps=1e-; int n;
int x[maxn]; double MIN;
double ans[maxn];
double p[maxn]; double solve(double dis)
{
double tmmp=INF;
for(int i=;i<=n;i++)
{
double tmp = ;
p[i]=x[i];
for(int j=i-;j>;j--)
{
tmp+=abs(p[j+]-x[j]-dis);
p[j]=p[j+]-dis;
}
for(int j=i+;j<=n;j++)
{
tmp+=abs(x[j]-p[j-]-dis);
p[j]=p[j-]+dis;
} if(tmp<MIN)
{
MIN=tmp;
memcpy(ans,p,sizeof(p));
}
if(tmp<tmmp)
tmmp = tmp;
}
return tmmp;
} int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
//freopen("in.txt","r",stdin);
while(~scanf("%d",&n))
{
for(int i=;i<=n;i++)
scanf("%d",&x[i]); double L = , R=;
for(int i=;i<n;i++)
R=max(R,(double)(x[i+]-x[i])); MIN = INF; while(R-L>=eps)
{
double mid = (L+R)/.;
double mmid = (mid+R)/.;
if(solve(mid)>solve(mmid)) L=mid;
else R=mmid;
} printf("%.4f\n",MIN);
for(int i=;i<=n;i++)
{
printf("%.7f%c",ans[i],i==n?'\n':' ');
}
}
return ;
}
Gym 101246J Buoys(三分查找)的更多相关文章
- HDU 5144 NPY and shot(物理运动学+三分查找)
NPY and shot Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- HDU4355 三分查找
/* * 三分查找 */ #include<cstdio> #include<cmath> #define eps 1e-6 //typedef __int64 LL; i ...
- hdu_2899_Strange fuction(三分查找)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2899 题意:让你解方程 题解:对于只有一个凸或者没有凸的图像,可以直接上三分解决. #include& ...
- HDU 2438 Turn the corner(三分查找)
托一个学弟的福,学了一下他的最简便三分写法,然后找了一道三分的题验证了下,AC了一题,写法确实方便,还是我太弱了,漫漫AC路!各路大神,以后你们有啥好的简便写法可以在博客下方留个言或私信我,谢谢了! ...
- 牛客练习赛28 E迎风舞 (三分查找)
链接:https://www.nowcoder.com/acm/contest/200/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- Gym 100792C Colder-Hotter (三分)
题意:系统有一个点对,让你去猜,每次你猜一个,如果这个数和系统里的那个点距离比上一个你猜的近,那么返回1,否则返回0,第一次猜一定返回0,在不超过500次的情况下,猜出正确答案. 析:是一个简单的三分 ...
- 二分查找 && 三分查找
LeetCode34. Find First and Last Position of Element in Sorted Array 题意:找出指定元素出现的范围,Ologn 思路:两次二分 cla ...
- CSU 1548 Design road(三分查找)
题目链接:https://cn.vjudge.net/problem/142542/origin Description You need to design road from (0, 0) to ...
- ZOJ 3203 Light Bulb (三分查找)
Light Bulb Time Limit: 1 Second Memory Limit: 32768 KB Compared to wildleopard's wealthiness, h ...
随机推荐
- localstorage - HTML 5 Web 存储总结---【巷子】
001.localStorage概念 在html5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储,解决了cookie存储空间不足的问题(cookie中每条cookie存储 ...
- Windows安装使用git
下载安装Windows安装文档Git-2.16.2-64-bit双击安装(安装过程不详述) 打开git客户端 新建代码命令 mkdir /c/code 进入该目录(对应windows的c盘下面的目录) ...
- 括号匹配问题(区间dp)
简单的检查括号是否配对正确使用的是栈模拟,这个不必再说,现在将这个问题改变一下:如果给出一个括号序列,问需要把他补全成合法最少需要多少步? 这是一个区间dp问题,我们可以利用区间dp来解决,直接看代码 ...
- python 对shell 命令的 执行 逻辑 在一台机器上执行另一台机器的命令; 跨节点 执行命令
import os l = ['ssh a;scp /data/visitlog/*11* root@d:/data/mapReduceVisitorLog/'] # b c for i in l: ...
- Linux下的pure-ftp的安装详解
FTP(File Transfer Protocol)是文件传输协议,常用于Internet上控制文件的双向传输.同时,它也是一个应用程序,用户可以通过它把自己PC机与世界各地所运行FTP协议的服务器 ...
- JS对话框
提示: alert("我是好人"); 确定,取消 if(confirm("我是好人?")){ alert("确定"); }else{ ale ...
- grep命令做永久别名 显示颜色
grep命令做永久别名 显示颜色 http://jingyan.baidu.com/article/22fe7ced17c1543002617f9c.htmlhttp://blog.csdn.net ...
- [World Wind学习]22.相机高度和瓦片等级计算
在这里我们看到判断Lod的级别主要有三个条件: * 1.相机视角范围,视角范围越大,所包含的tileSize就越大 * 2.相机与瓦片距离,距离越远,所包含的tileSize也就越大 * 3.相机视锥 ...
- mysql++使用
Mysql++是官方发布的.一个为MySQL设计的C++语言的API.Mysql++为Mysql的C-Api的再次封装,它用STL(Standard Template Language)开发并编写,并 ...
- Check out our list of adidas NMD Singapore retailers
The adidas NMD Singapore is confirmed to produce on The month of january 14th at select adidas Origi ...