hdu4717 The Moving Points(二分做法)
这道题看了大家都是用三分做的,其实这道题也是可以用二分来做的,就是利用一下他们的单调性。
对于N个点,总共要考虑N(N+1)/2个距离,距离可以用二次函数表示,而且开口都是向上的。
下面具体说一下二分的过程:
令mid=(L+R)/2,求出在mid时刻的最大距离,同时标记这个最大距离所在的二次函数,
这时候需要判断下mid时刻与对称轴之间的位置关系
1、当mid在对称轴右边时,由于开口是向上的,则最大距离往右是递增的,不可能取到更小值,所以令R=mid;
2、同理,当mid在对称轴左边时,由于开口是向上的,则最大距离往左是递增的,不可能取到更小值,所以令L=mid;
继续二分直到取得足够的精度。
#include<stdio.h>
#include<math.h>
#include<string.h>
#define LL long long
LL x[333],y[333],vx[333],vy[333],xx,yy,vxx,vyy;
LL a[111111],b[111111],c[111111];
double d[111111];
double ans,time;
double solve(int len)
{
double l=0,r=100,mid,cur,dis;
int i,flag;
while(r-l>0.00001)
{
cur=0;
mid=(r+l)/2;
for(i=1;i<len;i++){
dis=a[i]*mid*mid+b[i]*mid+c[i];
if(dis>cur){
cur=dis;
if(mid>d[i])flag=1;//判断mid点与对称轴之间的位置关系
else flag=-1;
}
}
if(cur<ans)ans=cur;
if(flag>0)r=mid;
else l=mid;
}
return mid;
}
int main()
{
int t,i,j,k;
int n,cas=1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%I64d%I64d%I64d%I64d",&x[i],&y[i],&vx[i],&vy[i]);
if(n==1){
printf("Case #%d: 0.00 0.00\n",cas++);
continue;
}
for(i=1,k=1;i<n;i++){
for(j=i+1;j<=n;j++){
xx=x[i]-x[j];yy=y[i]-y[j];
vxx=vx[i]-vx[j];vyy=vy[i]-vy[j];
c[k]=xx*xx+yy*yy;b[k]=2*(xx*vxx+yy*vyy);a[k]=vxx*vxx+vyy*vyy;//二次函数的系数
d[k]=-b[k]/(2.0*a[k]);//d[]k]表示对称轴的位置
k++;
}
}
ans=1e15;
time=solve(k);
printf("Case #%d: %.2f %.2f\n",cas++,time,sqrt(ans));
}
return 0;
}
hdu4717 The Moving Points(二分做法)的更多相关文章
- HDU-4717 The Moving Points(凸函数求极值)
The Moving Points Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- hdu4717 The Moving Points 三分法
题意:坐标系上有n个点,每个点的坐标和移动方向速度告诉你,速度方向都是固定的.然后要求一个时刻,使得这个时刻,这些点中最远的距离最小. 做法:三分法,比赛的时候想不到.考虑两个点,如果它们走出来的路径 ...
- ACM学习历程—HDU4717 The Moving Points(模拟退火 || 三分法)
Description There are N points in total. Every point moves in certain direction and certain speed. W ...
- The Moving Points hdu4717
The Moving Points Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDOJ 4717 The Moving Points
The Moving Points Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 4717The Moving Points warmup2 1002题(三分)
The Moving Points Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 4717 The Moving Points (三分)
The Moving Points Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDUOJ---The Moving Points
The Moving Points Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- F. Moving Points 解析(思維、離散化、BIT、前綴和)
Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...
随机推荐
- C# Best Practices - Creating Good Properties
Coding Properties Code in the Getter Check the user's credentials Check application state Format the ...
- /etc/group文件详解
Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件.linux /etc/group文件是有关于系统管理员对用户 ...
- shell学习之常用命令总结
1.find命令 主要用途:主要用来做文件查找. 使用方法:查找文件的方式可以基于:文件名,文件时间属性,文件的所有者和组,文件权限属性,文件类型属性,文件大小,另外可以指定 查找目录的深度,排除指定 ...
- 英文:known good assembly(KGA) / 中文:确认好的组装件,已知好组装件
英文:known good assembly(KGA) / 中文:确认好的组装件,已知好组装件 正确地操作印制板装配,并可作为标准件与其它同类型装配件比较的组装.也称黄金组装.
- ORACLE uuid自己主动生成主键
-- Create table create table TECHNOLOGYCOMPANY ( ID VARCHAR2(32) default SYS_GUID() not null, FLOWID ...
- Java简单记录
XML指令: <?xml version="1.0" encoding="UTF-8" standalone="no" ?> & ...
- ASP.NET事务存储过程
--修改存储过程 alter proc proc_get_student as select * from student; asp.net 的事务就是针对数据层来处理的呀! 没有数据处理不能使用事务 ...
- Codeforces Round #315 (Div. 2C) 568A Primes or Palindromes? 素数打表+暴力
题目:Click here 题意:π(n)表示不大于n的素数个数,rub(n)表示不大于n的回文数个数,求最大n,满足π(n) ≤ A·rub(n).A=p/q; 分析:由于这个题A是给定范围的,所以 ...
- c++,public/protected/private权限修饰符
1.public的变量可以在类中以及外部访问到: 2. private只可以在类/友元中访问到. #include <iostream> using namespace std; //-- ...
- 字符串查找函数 find()函数
find()函数可以帮助你在两个字符串之间,查找很多他们的关系... #include<iostream> #include<string> using namespace s ...