HDU 4717The Moving Points warmup2 1002题(三分)
The Moving Points
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 710 Accepted Submission(s): 290
For each test case, first line has a single number N (N <= 300), which is the number of points.
For next N lines, each come with four integers X
i, Y
i, VX
i and VY
i (-10
6 <= X
i, Y
i <= 10
6, -10
2 <= VX
i , VY
i <= 10
2), (X
i, Y
i) is the position of the i
th point, and (VX
i , VY
i) is its speed with direction. That is to say, after 1 second, this point will move to (X
i + VX
i , Y
i + VY
i).
2
0 0 1 0
2 0 -1 0
2
0 0 1 0
2 1 -1 0
Case #2: 1.00 1.00
题目大意:有n个点,这些点有各自的起始坐标和x,y方向的速度,问你在什么时刻,这些点两两之间的最大距离最小,求出时刻与距离。比赛的时候写的暴力枚举,觉得三分应该靠不住,单调性并不一定是一个抛物线的样子。最大值应该是连续的,而且是个开口向上的抛物线的单调关系。某一时刻有了最小的距离之后,会越走越远。由于求最小值,会想到三分。
题目地址:The Moving Points
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdio>
using namespace std;
double eps=1e-6;
int n; //点的个数
struct mq
{
double x;
double y;
double vx;
double vy;
};
mq node[305]; double dis(mq a,mq b,double t)
{
return sqrt((a.x+a.vx*t-b.x-b.vx*t)*(a.x+a.vx*t-b.x-b.vx*t)+(a.y+a.vy*t-b.y-b.vy*t)*(a.y+a.vy*t-b.y-b.vy*t));
} double cal(double t)
{
int i,j;
double ans=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
ans=max(ans,dis(node[i],node[j],t));
return ans;
} int main()
{
int tes,i;
scanf("%d",&tes);
int cas=0;
while(tes--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lf%lf%lf%lf",&node[i].x,&node[i].y,&node[i].vx,&node[i].vy); double left,right,mid,mimid;
left=0,right=10000000;
while(right-left>eps)
{
mid=(left+right)/2.0,mimid=(right+mid)/2.0;
if(cal(mid)<cal(mimid))
right=mimid;
else
left=mid;
} printf("Case #%d: %.2f %.2f\n",++cas,mid,cal(mid));
} return 0;
} /*
45
2
0 0 1 0
2 0 -1 0
2
-1000000 0 1 0
1000000 0 -1 0
2
1000000 0 0 0
-1000000 0 0 0
2
1000000 1000000 0 0
-1000000 -1000000 0 0
3
2 2 0 0
1 1 0 0
4 4 0 0
*/
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdio>
using namespace std;
double eps=1e-6;
int n;
struct mq
{
double x;
double y;
double vx;
double vy;
};
mq node[305];
double ps,pt; void cal()
{
double fent=10000000;
double l=0,r=fent,t;
int i,j;
while(fent>eps)
{
for(t=l; t<=r; t+=fent)
{
double tmp=0;
for(i=0; i<n; i++)
for(j=i+1; j<n; j++)
{
double a,b,c,d;
a=node[i].x+node[i].vx*t;
b=node[i].y+node[i].vy*t;
c=node[j].x+node[j].vx*t;
d=node[j].y+node[j].vy*t;
double sq=sqrt((a-c)*(a-c)+(b-d)*(b-d));
if(sq>tmp)
tmp=sq;
}
if(tmp<ps)
{
ps=tmp;
pt=t;
}
}
if(pt<fent)
{
l=0,r=fent;
}
else
{
l=pt-fent,r=pt+fent;
}
fent=fent/10.0;
}
}
int main()
{
int tes,i;
scanf("%d",&tes);
int cas=0;
while(tes--)
{
scanf("%d",&n);
for(i=0; i<n; i++)
scanf("%lf%lf%lf%lf",&node[i].x,&node[i].y,&node[i].vx,&node[i].vy); ps=100000000.0;
cal();
printf("Case #%d: %.2f %.2f\n",++cas,pt,ps);
}
return 0;
} /*
45
2
0 0 1 0
2 0 -1 0
2
-1000000 0 1 0
1000000 0 -1 0
2
1000000 0 0 0
-1000000 0 0 0
2
1000000 1000000 0 0
-1000000 -1000000 0 0
3
2 2 0 0
1 1 0 0
4 4 0 0
*/
HDU 4717The Moving Points warmup2 1002题(三分)的更多相关文章
- hdu 4717 The Moving Points(第一个三分题)
http://acm.hdu.edu.cn/showproblem.php?pid=4717 [题意]: 给N个点,给出N个点的方向和移动速度,求每个时刻N个点中任意两点的最大值中的最小值,以及取最小 ...
- 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 ...
- HDOJ 4717 The Moving Points
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 ...
- HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011亚洲北京赛区网络赛)
HDU 4041 Eliminate Witches! (模拟题 ACM ICPC 2011 亚洲北京赛区网络赛题目) Eliminate Witches! Time Limit: 2000/1000 ...
- HDU 2802 F(N)(简单题,找循环解)
题目链接 F(N) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- The Moving Points hdu4717
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的題目更容易 ...
随机推荐
- linux innode图解2
http://www.opsers.org/linux-home/base/the-knowledge-that-one-day-learn-linux-file-system.html 文件系统是操 ...
- MySQL Error Handling in Stored Procedures---转载
This tutorial shows you how to use MySQL handler to handle exceptions or errors encountered in store ...
- thinkphp实现短信验证注册
前言 注册时经常需要用到短信验证码,本文记录一下思路和具体实现. 短信验证平台使用云片,短信验证码的生成使用thinkphp. 思路 1.用户输入手机号,请求获取短信验证码. 2.thinkphp生成 ...
- PhalGo-介绍
PhalGo-介绍 phalgo是一个Go语言的一体化开发框架,主要用于API开发应为使用ECHO框架作为http服务web程序一样可以使用,牛顿曾经说过"如果我比别人看得远,那是因为我站在 ...
- try、catch、finally与return
1 try catch finally语句基础知识 finally一定会被执行. try块发生异常才会执行catch块. 如果finally块中抛出异常,则整个try.catch.finally块中抛 ...
- HDU 4296 Buildings(贪心)
题意: 给定n个建筑物,每个建筑物都有两个属性w, s,每个建筑物都有一个PDV = (Σw j)-s i .意思就是它上面的所有的w相加减去它的s,让求怎么放置这个建筑物使得每个建筑物当中PDV最大 ...
- CakePHP的文章分类的功能实现
前些天实现了[微个人.大家园]的文章文类功能.现在回忆一下,是如何完成的吧. 具体的操作步骤如下: 1.在文章posts表里添加一个列,category_id. 2.在数据库中添加一个数据表,cate ...
- gulp的常用api
gulp是什么? http://gulpjs.com/ 相信你会明白的! 与著名的构建工具grunt相比,有什么优势呢? 易于使用,代码优于配置 高效,不会产生过多的中间文件,减少I/O压力 易于学习 ...
- jdbc - Insert 'Date' value in PreparedStatement
“preparedStatement.setDate()”方法接受的是 'java.sql.Date' 类型的参数,而我们一般格式化日期所使用的是'java.util.Date'中的'SimpleDa ...
- metalink下载补丁包
以下截图 截取自 某 升级包中携带的 readme文档 把以上图片转换为 文字 Download and Install Patch Updates Refer to the My Oracle Su ...