慧聪网的网站建设策略营销型 展示类网站模板
web/
2025/10/1 3:30:02/
文章来源:
慧聪网的网站建设策略,营销型 展示类网站模板,深圳专业网络营销外包公司,猪八戒做网站怎么样题目描述 Description Xaviera现在遇到了一个有趣的问题。平面上有N个点#xff0c;Xaviera想找出周长最小的三角形。由于点非常多#xff0c;分布也非常乱#xff0c;所以Xaviera想请你来解决这个问题。为了减小问题的难度#xff0c;这里的三角形也包括共线的三点。 输… 题目描述 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的一个矩形然后对矩形内的点暴力选更新最优解即可。 代码 #includeiostream
#includecstdio
#includecstring
#includealgorithm
#includecmath
#includequeue
using namespace std;
typedef long long LL;
#define mem(a,b) memset(a,b,sizeof(a))
typedef pairdouble,int PDI;
const int maxn200010;
const double oo2147483647;
inline int read()
{int x0,f1;char cgetchar();while(!isdigit(c)){if(c-)f-1;cgetchar();}while(isdigit(c)){xx*10c-0;cgetchar();}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(xs.x)return ys.y;return xs.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.firstb.first;}
double mdis(int l,int r)
{if(l1r)return oo;if(l2r)return triangle_perimeter(p[l].x,p[l].y,p[l1].x,p[l1].y,p[r].x,p[r].y);int mid(lr)1,t0;double dmin(mdis(l,mid),mdis(mid,r));for(int il;ir;i)if(fabs(p[i].x-p[mid].x)d/2.0)s[t]make_pair(p[i].y,i); sort(s,st,cmp);int st0,ed;while(stt-2){edst1;while(fabs(s[ed].first-s[st].first)(d/2.0) edt-2)ed;for(int ist1;ied;i)for(int ji1;jed;j)dmin(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()
{nread();for(int i0;in;i)x(double)read(),y(double)read(),p[i]Point(x,y);sort(p,pn);printf(%.6lf\n,mdis(0,n-1));return 0;
} View Code 总结滑动窗口好难写。 转载于:https://www.cnblogs.com/FYH-SSGSS/p/7061175.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84816.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!