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的題目更容易 ...
随机推荐
- vim: 字符串替换
:s/str1/str2/ 替换当前行第一个 str1 为 str2:s/str1/str2/g 替换当前行所有 str1 为 str2 ( 注意, s/xx/xxx/g 语句从s开始,中间的空格视 ...
- [LeetCode]题解(python):009-Palindrome Number
题目来源: https://leetcode.com/problems/palindrome-number/ 题意分析: 这题是要判断一个int是否一个回文数,要求不能申请额外的空间. 题目思路: 这 ...
- 【转】NP-Hard和NP-Complete的区别
原文来自:http://hi.baidu.com/nuclearspace/item/e0f8a1b777914974254b09f4 对 NP-Hard问题和NP-Complete问题的一个直观的理 ...
- querySelector和querySelectorAll方法介绍
module dom { [Supplemental, NoInterfaceObject] interface NodeSelector { Element querySelector(in DOM ...
- Qt Creator插件工作流程代码走读
Qt Creator有个很风骚的插件管理器PluginManager,还有个很骚包的插件说明PluginSpec.基本上,所有的Qt程序的入口都是传统的C程序一样,代码流程从main()函数开始. ...
- C++ ABI之名字改变,编译器生成符号研究(以Qt为例)
在C++中,由于重载等技术的存在,编译器要将函数.结构体.类等等的信息传递给链接器,就不能像C语言那样简单地通过函数名来完成,它需要提供额外的参数信息,而还要和C语言共用链接器,这就需要用到名字改编( ...
- java学习之动态代理模式
package com.gh.dynaproxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Metho ...
- Unity KillCount
using UnityEngine; using System.Collections; public class KillCountMult : MonoBehaviour { public GUI ...
- 解惑:NFC手机怎样轻松读取银行卡信息?
自支付宝钱包8.0推出了NFC新功能,仅仅要将支持NFC功能的手机靠近公交卡.银行卡等带有芯片的IC卡上,可迅速读取卡内剩余金额.卡的信息,还能够给卡进行充值,很贴心有用. 可是非常多网友表示担忧,要 ...
- python3.4.3将汉字转换为大写拼音首字母
from pypinyin import pinyin a=pinyin(u'杨强',type=FIRST_LETTER) --->此时返回一个列表并赋给a(元素也是列表) b=[] - ...