HDU-3548-Enumerate the Triangles

求由所有的点组成的三角形中周长最小的三角形的周长

1.将所有的点按横坐标大小排序

2.从第一个点开始往后枚举,判断能否组成三角形,判断当前三角形周长是否小于已经得到的最小周长

代码如下:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const double INF=1000000000.0;
double juli(double x1,double y1,double x2,double y2)
{
return (sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)));
}
struct point
{
int x;
int y;
} p[1000+10];
bool cmp(point a,point b)
{
return a.x<b.x;
}
bool One_Line(const point& s1,const point &s2,const point &s3 )
{
return (s3.x-s2.x)*(s2.y-s1.y) == (s2.x-s1.x)*(s3.y-s2.y);
}
int main()
{
int T,n,i,j,t=1;
scanf("%d",&T);
while(T--)
{
cin>>n;
for(i=0; i<n; i++)
cin>>p[i].x>>p[i].y;
sort(p,p+n,cmp);
double mini=INF;
int flog=0;
for(i=0; i<n; i++)
{
for(j=i+1; j<n; j++)
{
if(mini<=2*(p[j].x-p[i].x)) break ;//横坐标的差大于周长的一半,它都大于周长的一半了
//由这两点组成的三角形周长肯定大于mini,不要
double a1=juli(p[i].x,p[i].y,p[j].x,p[j].y);
if(mini<=2*a1) continue ; //同上,只是不跳出循环,判断下一个
for(int k=j+1; k<n; k++)
{
if(mini<=2*(p[j].x-p[k].x)) break ;
if(One_Line(p[i],p[j],p[k])) continue ;
double a2=juli(p[j].x,p[j].y,p[k].x,p[k].y);
double a3=juli(p[i].x,p[i].y,p[k].x,p[k].y);
if(a1+a2+a3<mini)
{
mini=a1+a2+a3;
flog=1;
}
}
}
}
cout<<"Case "<<t++<<": ";
if(flog) printf("%.3lf\n",mini);
else cout<<"No Solution"<<endl;
}
return 0;
}

HDU-3548-Enumerate the Triangles,布布扣,bubuko.com

时间: 2024-10-08 23:40:20

HDU-3548-Enumerate the Triangles的相关文章

HDU 3458 Enumerate the Triangles(最小周长三角形)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3548 题意: 给定N个点的坐标求这些点能够成的周长最小的三角形的周长. 分析: 设三角形的三变长分别为,a,b,c;  a<b+c;L=a+b+c; 因此当我们的当前的最小周长如果小于其中一条边的二倍的话 那么很明显有这个边构成的三角形的周长一定大于现在的周长, 我们可以根据这个性质进行减枝. 代码如下: #include <iostream> #include <cstdio>

多校 #5 hdu 5784 How Many Triangles

http://acm.hdu.edu.cn/showproblem.php?pid=5784 给定平面上互不相同的n个点,求所有锐角三角形的个数.3<=n<=2000 锐角三角形因为要三个角都是锐角,所以限制条件多.即使枚举一个点,另外两条边用极角排序,也只能维护一个锐角,剩下的两个角难于统计. 但是,如果换一种思路,统计所有直角.钝角以及三点共线的个数 ,问题就简单多了.因为因为只有一个直角或钝角或平角,只需依次对每个点,统计以它为哪一个特殊角的直角.钝角.平角三角形有多少即可. 具体做法是

HDU 5784 How Many Triangles

给你一堆点,找锐角三角形. TWO POINTER 思想. 统计出所有锐角和直=钝角的数目. 做法是这样的:对每个点对所有点极角排序,然后TWO POINTER计算每一个锐角(一个边上有好几个点也会被统计好几次),直角钝角.然后ans=(锐角个数-直角钝角个数*2)/3;因为每一个角度可能也只可能出现在一个三角形中. 但是一上来没弄懂,所以队友想了一个思路也能过,先统计直角和钝角的个数.然后C(n,3)统计所有情况,不能构成三角形的是三点共线的情况,所以n^2logn统计三点共线(TWO POI

数据降维 实例

secom.data 3030.93 2564 2187.7333 1411.1265 1.3602 100 97.6133 0.1242 1.5005 0.0162 -0.0034 0.9455 202.4396 0 7.9558 414.871 10.0433 0.968 192.3963 12.519 1.4026 -5419 2916.5 -4043.75 751 0.8955 1.773 3.049 64.2333 2.0222 0.1632 3.5191 83.3971 9.5126

HDU 5135 Little Zu Chongzhi&#39;s Triangles(简单水题)

题目链接: 戳我 题目大意: 给一堆 木棍,用这些木棍组成三角形,要组成的所有的三角形的面积和最大,不一定要用完所有的木棍. 样例解释: 3 //三个棍子 1 1 20   // 每个棍子的长度,自然,这三个棍子不可能组成三角形,故输出 0.00 7          // 7个棍子 3 4 5 3 4 5 90 // 组成两个三角形(3, 3 4)和(4, 4, 5),面积和即为13.64 0   // 输出 0 退出 解题思路: 本来不想写题解的,因为太水了,,,,,,, 可是看到 谷歌搜出

[HDU 5135] Little Zu Chongzhi&#39;s Triangles (dfs暴搜)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5135 题目大意:给你n条边,选出若干条边,组成若干个三角形,使得面积和最大.输出最大的面积和. 先将边从小到大排序,这样前面的两条边加起来如果不大于第三条边就可以跳出,这是一个存在性条件. dfs(int idx,int now,int cnt,int nowmax)代表我当前处理的是第idx条边,已经加入边集的有cnt条边,当前的边的长度和为now,组成的最大面积和为nowmax. 暴力枚举每个三

hdu 1396 Counting Triangles (递推)

Counting Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2012    Accepted Submission(s): 966 Problem Description Given an equilateral triangle with n the length of its side, program to

hdu 5135 Little Zu Chongzhi&#39;s Triangles 状压DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5135 从大到小贪心是不对的! 比如 4 30 40 50 89 这组数据 结果应该是600 如果取后三条边只会是一个细长细长的三角形根本没多大面积 只不过因为数据水然后贪心碰巧能过而已 看到网上题解很多人用贪心我好郁闷... 状压DP 看到边的数目很少就应该想到这个了 先枚举可能出现的所有三角形 记录他们使用了那些边还有他们的面积 然后再枚举状态之中 套一层遍历所有三角形的循环 如果当前状态和三角形

hdu 5135 Little Zu Chongzhi&#39;s Triangles

http://acm.hdu.edu.cn/showproblem.php?pid=5135 题意:给你N个木棍的长度,然后让你组成三角形,问你组成的三角形的和最大是多少? 思路:先求出可以组成的所有的三角形,然后状压dp就可以.求所有的三角形也可以用状压,也可以三重循环求. 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 #define

HDU 5135 Little Zu Chongzhi&#39;s Triangles (14广州 状压dp)

Little Zu Chongzhi's Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 474    Accepted Submission(s): 252 Problem Description Zu Chongzhi (429–500) was a prominent Chinese mathematici