hdu-4717-The Moving Points三分
2016-04-19 00:10
330 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4717
画图得,最后的抛物线合并起来 去顶端部分。。。一定是 单峰函数。。所以三分。。
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
double eps=1e-6;
struct POINT
{
double x,y;
POINT(double a=0,double b=0)
{x=a,y=b;}
};
double dist(POINT p1,POINT p2)
{
return ( sqrt((p1.x-p2.x)*(p1.x-p2.x)+ (p1.y-p2.y)*(p1.y-p2.y) ) );
}
POINT point[310];
POINT idx[310];
double vx[310],vy[310];
double ans;
int n;
double bin(double x)
{
int i,j;
double maxx=0;
for (i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
double xx1=point[i].x+x*vx[i];
double yy1=point[i].y+x*vy[i];
double xx2=point[j].x+x*vx[j];
double yy2=point[j].y+x*vy[j];
double tmp=dist(POINT(xx1,yy1),POINT(xx2,yy2));
if (tmp>maxx)
maxx=tmp;
}
}
if (maxx<ans) ans=maxx;
return maxx;
}
int main()
{
int t;
cin>>t;int cnt=1;
while(t--)
{
int i;
cin>>n;
for (i=1;i<=n;i++)
{
scanf("%lf%lf%lf%lf",&point[i].x,&point[i].y,&vx[i],&vy[i]);
}
double l=0;
double r=1e16;
ans=1e16;
for (i=0;i<200;i++)
{
double m1=l+(r-l)/3;
double m2=r-(r-l)/3;
if (bin(m1)<bin(m2))
r=m2;
else l=m1;
}
printf("Case #%d: %.2lf %.2lf\n",cnt++,l,ans);
}
return 0;
}
画图得,最后的抛物线合并起来 去顶端部分。。。一定是 单峰函数。。所以三分。。
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
double eps=1e-6;
struct POINT
{
double x,y;
POINT(double a=0,double b=0)
{x=a,y=b;}
};
double dist(POINT p1,POINT p2)
{
return ( sqrt((p1.x-p2.x)*(p1.x-p2.x)+ (p1.y-p2.y)*(p1.y-p2.y) ) );
}
POINT point[310];
POINT idx[310];
double vx[310],vy[310];
double ans;
int n;
double bin(double x)
{
int i,j;
double maxx=0;
for (i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
double xx1=point[i].x+x*vx[i];
double yy1=point[i].y+x*vy[i];
double xx2=point[j].x+x*vx[j];
double yy2=point[j].y+x*vy[j];
double tmp=dist(POINT(xx1,yy1),POINT(xx2,yy2));
if (tmp>maxx)
maxx=tmp;
}
}
if (maxx<ans) ans=maxx;
return maxx;
}
int main()
{
int t;
cin>>t;int cnt=1;
while(t--)
{
int i;
cin>>n;
for (i=1;i<=n;i++)
{
scanf("%lf%lf%lf%lf",&point[i].x,&point[i].y,&vx[i],&vy[i]);
}
double l=0;
double r=1e16;
ans=1e16;
for (i=0;i<200;i++)
{
double m1=l+(r-l)/3;
double m2=r-(r-l)/3;
if (bin(m1)<bin(m2))
r=m2;
else l=m1;
}
printf("Case #%d: %.2lf %.2lf\n",cnt++,l,ans);
}
return 0;
}
相关文章推荐
- Java中的IO操作(一)
- Unity3D Terrain 变成粉色(紫色/洋红色)解决方案!
- UVa567 Risk(floyd)
- E-Moving Tables|贪心
- Mysql学习(一) windows7 mysql5.7.12 noinstall安装
- 关于js封装框架类库之样式操作
- hdu 4540 dp 记忆化搜索
- 1005 of search
- 【一天一道LeetCode】#10. Regular Expression Matching
- 【一天一道LeetCode】#10. Regular Expression Matching
- load image
- jQuery Ajax 调用WebService实例详解
- jvm简介
- font简写语法
- 多线程编程中保证线程安全(1)
- LeetCode 刷题:Q1:Two Sum
- Marsaglia XORshift随机数算法
- LeetCode 79. Word Search
- Android架构知识
- 二叉搜索树的后序遍历序列