博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 4717 The Moving Points(三分)
阅读量:7114 次
发布时间:2019-06-28

本文共 1397 字,大约阅读时间需要 4 分钟。

题目大意:给出n个点,每一个点有初始的位置(x,y),以及单位时间内移动的距离,向量形式给出。且在哪一个时刻中,n个点之间两两距离的最大值最小,最小值为多少。

解题思路:类似与二分算法的三分,由于假设将时间t和所要求的两两之间距离的最大值d做成一个函数曲线,单调性应该是先递减后递增的,所以用三分法求极值。

#include 
#include
#include
#include
using namespace std;const int N = 305;const double eps = 1e-6;struct point { double x; double y;}s[N], p[N];int n;void init () { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%lf%lf%lf%lf", &s[i].x, &s[i].y, &p[i].x, &p[i].y);}inline double dis (double x, double y) { return sqrt(x*x+y*y);}double cat (double k) { double ans = 0; for (int i = 0; i < n; i++) { double xi = s[i].x + p[i].x * k; double yi = s[i].y + p[i].y * k; for (int j = i + 1; j < n; j++) { double pi = s[j].x + p[j].x * k; double qi = s[j].y + p[j].y * k; ans = max(ans, dis(xi-pi, yi-qi)); } } return ans;}void solve () { double l = 0; double r = 0xffffff; while (fabs(r-l) > eps) { double tmp = (r-l)/3; double midl = l + tmp; double midr = r - tmp; if (cat(midl) < cat(midr)) r = midr; else l = midl; } printf("%.2lf %.2lf\n", l, cat(l));}int main () { int cas; scanf("%d", &cas); for (int i = 1; i <= cas; i++) { init (); printf("Case #%d: ", i); solve(); } return 0;}

转载地址:http://kbghl.baihongyu.com/

你可能感兴趣的文章
哦耶!!拿到录取通知书啦
查看>>
MySQLJk
查看>>
php-fpm进程数优化
查看>>
智能指针
查看>>
安装Ubuntu 18
查看>>
10个帮助你创建超棒jQuery插件的小技巧
查看>>
分享10个jQuery的动态插件
查看>>
数据结构(07)_队列
查看>>
我在学LINUX这几月
查看>>
程序员的故事【番外篇一】
查看>>
信息化工程师的日常
查看>>
MaxCompute SQL 2.0全新的计算引擎
查看>>
Linux学习笔记第五周第四次课(3月8日)
查看>>
用windows命令解压chm文件
查看>>
VMware中三种网络连接的区别
查看>>
PHP课程总结20161111
查看>>
linux环境下搭建W12Scan:一款功能强大的网络安全资产扫描引擎
查看>>
SylixOS PCI BAR寄存器
查看>>
SharedPreferences.Editor 的apply()与commit()方法的区别
查看>>
php基础语法
查看>>