[BZOJ2458][BeiJing2011]最小三角形
题目描述 Description |
Xaviera现在遇到了一个有趣的问题。平面上有N个点,Xaviera想找出周长最小的三角形。由于点非常多,分布也非常乱,所以Xaviera想请你来解决这个问题。为了减小问题的难度,这里的三角形也包括共线的三点。 |
输入描述 Input Description |
第一行包含一个整数N表示点的个数。接下来N行每行有两个整数,表示这个点的坐标。 |
输出描述 Output Description |
输出只有一行,包含一个6位小数,为周长最短的三角形的周长(四舍五入)。 |
样例输入 Sample Input |
4 1 1 2 3 3 3 3 4 |
样例输出 Sample Output |
3.414214 |
数据范围及提示 Data Size & Hint |
之前的一些废话:是时候准备会考了。。
题解:做法类似平面上求最近点对。首先把平面划分成两个部分,递归求出两个部分的答案为ans,然后,把离分割线距离小于ans/2的点全部加入队列,因为只有在这范围内答案才有可能比ans小,加入之后按照y坐标排一遍序,然后滑动窗口维护一下高度为ans/2的一个矩形,然后对矩形内的点暴力选,更新最优解即可。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> using namespace std; typedef long long LL; #define mem(a,b) memset(a,b,sizeof(a)) typedef pair<double,int> PDI; const int maxn=200010; const double oo=2147483647; inline int read() {int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f; } struct Point {double x,y;Point() {}Point(double _1,double _2):x(_1),y(_2){}bool operator < (const Point &s)const{if(x==s.x)return y<s.y;return x<s.x;} }p[maxn]; int n;double x,y; PDI s[maxn]; double dis(double a,double b,double c,double d){return sqrt((c-a)*(c-a)+(d-b)*(d-b)); } double triangle_perimeter(double a,double b,double c,double d,double e,double f){return dis(a,b,c,d)+dis(a,b,e,f)+dis(c,d,e,f); } bool cmp(PDI a,PDI b){return a.first<b.first;} double mdis(int l,int r) {if(l+1>=r)return oo;if(l+2==r)return triangle_perimeter(p[l].x,p[l].y,p[l+1].x,p[l+1].y,p[r].x,p[r].y);int mid=(l+r)>>1,t=0;double d=min(mdis(l,mid),mdis(mid,r));for(int i=l;i<=r;i++)if(fabs(p[i].x-p[mid].x)<=d/2.0)s[t++]=make_pair(p[i].y,i); sort(s,s+t,cmp);int st=0,ed;while(st<=t-2){ed=st+1;while(fabs(s[ed].first-s[st].first)<=(d/2.0) && ed<=t-2)ed++;for(int i=st+1;i<ed;i++)for(int j=i+1;j<ed;j++)d=min(d,triangle_perimeter(p[s[st].second].x,p[s[st].second].y,p[s[i].second].x,p[s[i].second].y,p[s[j].second].x,p[s[j].second].y)); st++;}return d; } int main() {n=read();for(int i=0;i<n;i++)x=(double)read(),y=(double)read(),p[i]=Point(x,y);sort(p,p+n);printf("%.6lf\n",mdis(0,n-1));return 0; }
View Code
总结:滑动窗口好难写。
转载于:https://www.cnblogs.com/FYH-SSGSS/p/7061175.html
[BZOJ2458][BeiJing2011]最小三角形相关推荐
- bzoj2458: [BeiJing2011]最小三角形
题目描述: $Xaviera$ 现在遇到了一个有趣的问题. 平面上有 $N$ 个点,$Xaviera$ 想找出周长最小的三角形. 由于点非常多,分布也非常乱,所以 $Xaviera$ 想请你来解决这个 ...
- BZOJ 2458 最小三角形(分治)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2458 题意:平面上有N个点,输出周长最小的三角形的周长. 思路:按照x升序.分治.然后就 ...
- bzoj 乱刷计划 50/50
前言 话说第一个板刷计划由于种种原因而告一段落了..其实那一版还有很多题想做,那就只能放一放了 附上效果图一张(几乎每一题都在我博客有题解): 打算 可以复习,重做自己做过的题,不局限于没做过的 乱刷 ...
- L3-021 神坛(极角排序求三角形最小面积)
在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...
- 【CCCC】L3-021 神坛 (30分)计算几何+求三角形面积(极角排序)
problem L3-021 神坛 (30分) 在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如 ...
- CCPC2019-湖南全国邀请赛(湘潭大学)
Problem A Chessboard 补题地址:http://acm.hdu.edu.cn/showproblem.php?pid=6532 题意:有n个点,其价值为i:分别对某一行.某一列以下的 ...
- 星光 SaaS 伙伴甄云科技:如何构建更适合快成长企业的数字化采购管理平台?
文章目录 前言 一.华为云助力中小企业快成长 二.SaaS 伙伴-甄云科技介绍 三.公司发展方向与要求的不匹配 3.1.快速成长型公司案例-戴尔 3.2.价值链和企业管理支撑不能匹配发展要求 四.支撑 ...
- 基于Problem Solving with Algorithms and Data Structures using Python的学习记录(4)——Recursion
4.1.目标 本章的目标如下: 要理解可能难以解决的复杂问题有一个简单的递归解决方案. 学习如何递归地写出程序. 理解和应用递归的三个定律. 将递归理解为一种迭代形式. 实现问题的递归公式化. 了解计 ...
- 2019.8.7 金华正睿集训总结Day11(ACM)
8.7 在这个欢乐的七夕佳节,我们迎来了欢乐的ACM 于是,在和yjz大佬和yy大佬严肃(?)讨论后,我们的队名就叫七夕"快乐"(为什么加引号就不说了,qq情头是和小号的某) 在前 ...
最新文章
- 有趣的计算机课的作文,有趣的电脑课作文500字
- 微信小游戏创业,究竟是红海还是死海?
- 一步一步学习C#(一)
- kubernetes性能测试实践
- [IE技巧] 如何禁止用户关闭IE浏览器
- 【CodeForces - 467C】George and Job(dp,思维)
- Oracle利用序列实现自动增长列
- visual studio 按钮判断管理员和用户_用户管理的设计原则
- cygwin 编译 android vlc,Cygwin 编译 VLC 问题
- 基于深度学习的手写数字识别、python实现
- 戴尔服务器板载系统raid管理,戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
- 动态文本_(302期)【动态】|| 立足相同文本,描绘不同风景 ——工作室开展“同课异构”活动...
- Android自定义ProgressBar样式:渐变圆角水平进度条
- 计算机的kb和m之间的换算,g和兆的换算(G和M之间的换算)
- 什么是延时直播?自定义配置延时直播
- 浙师大 计算机科学技术导论,计算机科学技术导论
- 桌面上计算机程序包能删吗,桌面上的软件怎么删除教程【图文】
- 微信小程序关注公众号
- 一个26岁的男人和43岁的女人
- 入党申请书可以用计算机打印吗,入党申请书能用计算机打印吗?
热门文章
- android 揭示动画_遗传编程揭示具有相互作用的多元线性回归
- C语言高级编程:二级指针的赋值
- VS2008,GDIPlus初步
- keil中断函数的写法_在 KeilC里,中断子程序与函数有何不同?( )_学小易找答案
- umi权限路由_Umi 小白纪实(三)—— 震惊!路由竟然如此强大!
- 运行catia_教程 | CATIA宏的录制及应用
- mysql第四项_mysql数据库的基本介绍与操作(第四篇-mysql索引篇)
- python怎么创建一个二维数组_python 创建二维数组的方法
- PMP:4.项目整合管理
- size_t为什么重要