hduoj 3548 Enumerate the Triangles
来源:互联网 发布:linux定时器关闭 编辑:程序博客网 时间:2024/06/05 12:38
题目不难理解:
求n个点中组成三角形的最小周长 (3 <= N <= 1000) (x,y) (0 <= X, Y <= 1000);
本人见解:
若是直接暴力三重循环n==1000定会超时,如不超时可能是编译器对你有好感了~~
A,B,C三条边,周长D=A+B+C,根据三角形三条边的互相约束,D>2*A && D>2*B&& D> 2*C(程序中用一个就行了)
若A是端点点a,b组成,A>=fabs(a.x-b.x), 故 D>(a.x-b.x)
所以按照x升序排序,若执行到ans<=fabs(a.x-b.x)就可以结束当前循环
如 if(ans<=2*fabs(1.0*p[i].x-p[j].x)) break;
话不多说,直接上代码
#include <cstdio>#include <cmath>#include <algorithm>#include <cctype>#define EPS 1e-6using namespace std;struct node{ int x,y;};node p[1200];bool cmp(const node &a,const node &b){ if(a.x<b.x) return true; return false;}double dis(node a,node b) // 求距离{ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}int line(node a,node b,node c) //判断三点是否在同一条线{ if( (a.y-b.y)*(a.x-c.x)==(a.y-c.y)*(a.x-b.x) ) return 1; return 0;}int main(){ int T,n,i,j,k,th=1; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&p[i].x,&p[i].y); } sort(p,p+n,cmp); double ans=200000000; for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if(ans<=2*fabs(1.0*p[i].x-p[j].x)) //执行到ans<=fabs(a.x-b.x)就可以结束当前循环 break; if(ans<=dis(p[i],p[j])) continue; for(k=j+1;k<n;k++) { if(ans<=2*fabs(1.0*p[j].x-p[k].x)) //执行到ans<=fabs(a.x-b.x)就可以结束当前循环 break; if(!line(p[i],p[j],p[k])) //判断三点是否在同一条线 ans=min(ans,dis(p[i],p[j])+dis(p[i],p[k])+dis(p[j],p[k])); } } } if(ans==200000000) // 所有点位于同一条线 printf("Case %d: No Solution\n",th++); else printf("Case %d: %.3lf\n",th++,ans); } return 0;}
1 0
- hduoj 3548 Enumerate the Triangles
- HDU NO.3548 Enumerate the Triangles
- hdu 3549 Enumerate the Triangles
- HDU 3548 Enumerate the Triangles(找周长最小的三角形)
- HDU 3548 Enumerate the Triangles(找周长最小的三角形+优化)
- HDU 3458 Enumerate the Triangles(最小周长三角形)
- Enumerate the Triangles&&http://cdn.ac.nbutoj.com/Contest/view/id/14/problem/E.xhtml
- HDU4682 The Happy Triangles
- nyoj18 The triangles 【DP】
- hduoj The calculation of GPA
- HDUOJ 1392 - Surrounding the Trees
- HDUOJ Let the Balloon Rise
- enumerate
- enumerate
- enumerate
- enumerate
- enumerate()
- Enumerate the network adaptor in system
- linux常用命令
- CSU 1558 和与积
- iOS设备安装App列表信息获取
- Java 使用 Redis
- 空间放入由右至左滚动图片代码
- hduoj 3548 Enumerate the Triangles
- 欢迎使用CSDN-markdown编辑器
- nyoj 整数划分(一)(二)
- 水手分椰子问题
- MySQL优化必须调整的10项配置
- 浅谈Java中的hashcode方法
- CentOS 7 更新源 – 使用国内 163 yum 源
- 深入理解this对象
- Oracle-06-常用数据类型