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>
#include <cmath>
#include <algorithm>
using namespace std;

const int maxn = 1010;

struct point{
    double x,y;
    bool operator < (const struct point &tmp)const{
        return x<tmp.x;
    }
}p[maxn];

inline double dis(point a,point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

inline bool check(point a,point b,point c)
{
    if((a.x-b.x)*(c.y-b.y)==(a.y-b.y)*(c.x-b.x))
        return false;
    return true;
}

int main()
{
    int n,t,cas=1;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        sort(p,p+n);
        bool f=0;
        double ans = 1000000000;
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(ans <= 2*( p[j].x - p[i].x) )break;
                double dd =dis(p[i],p[j]);
                for(int k=j+1;k<n;k++){
                    if(ans<=2*(p[k].x-p[i].x)) break;
                    if(check(p[i],p[j],p[k])){
                        f=1;
                        if(ans>dis(p[i],p[k])+dis(p[j],p[k])+dd)
                            ans = dis(p[i],p[k])+dis(p[j],p[k])+dd;
                    }
                }
            }
        }
        if(f) printf("Case %d: %.3lf\n",cas++,ans);
        else printf("Case %d: No Solution\n",cas++);
    }
    return 0;
}
时间: 2024-10-10 21:34:51

HDU 3458 Enumerate the Triangles(最小周长三角形)的相关文章

HDU 5224 Tom and paper(最小周长)

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description There is a piece of paper in front of Tom, its length and width are integer. Tom knows the area of this paper, he wants to know the minimum perimeter of this pap

hdu 1828 Picture(线段树&amp;扫描线&amp;周长并)

Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2578    Accepted Submission(s): 1363 Problem Description A number of rectangular posters, photographs and other pictures of the same shap

最小周长

基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个矩形的面积为S,已知该矩形的边长都是整数,求所有满足条件的矩形中,周长的最小值.例如:S = 24,那么有{1 24} {2 12} {3 8} {4 6}这4种矩形,其中{4 6}的周长最小,为20. Input 输入1个数S(1 <= S <= 10^9). Output 输出最小周长. Input示例 24 Output示例 20 最短的就是最中间的 附AC代码: 1 #include<iostr

1283 最小周长

1283 最小周长 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个矩形的面积为S,已知该矩形的边长都是整数,求所有满足条件的矩形中,周长的最小值.例如:S = 24,那么有{1 24} {2 12} {3 8} {4 6}这4种矩形,其中{4 6}的周长最小,为20. Input 输入1个数S(1 <= S <= 10^9). Output 输出最小周长. Input示例 24 Output示例 20 题目链接:http:/

HDU 1151 Air Raid(最小路径覆盖 = 顶点数 - 最大匹配数)

Air Raid Problem Description Consider a town where all the streets are one-way and each street leads from one intersection to another. It is also known that starting from an intersection and walking through town's streets you can never reach the same

1283 最小周长(水题)

1283 最小周长 题目来源: Codility 一个矩形的面积为S,已知该矩形的边长都是整数,求所有满足条件的矩形中,周长的最小值.例如:S = 24,那么有{1 24} {2 12} {3 8} {4 6}这4种矩形,其中{4 6}的周长最小,为20. Input 输入1个数S(1 <= S <= 10^9). Output 输出最小周长. Input示例 24 Output示例 20 虽然是一道简单的水题,但是通过比较别人的代码和自己的代码,还是学到了一些知识 别人的代码 15ms 20

UVA 12386 Smallest Polygon n个点的任意多边形求最小周长 科学的暴力

题目链接: 题意: 给定n个点,用n个点组成的多边形中(可以是凹多边形,但n个点一定要全在多边形上) 在所有能由n个点构成的多边形中 求最小面积的多边形的周长 - 最小周长. 思路: 首先我们选择一个定点,则接下来的数进行一个排列,有(n-1)!个排列. 这个序列相邻两个数之间有一条线段. 判断多边形合法:任意两条线段不相交即可.n^2 剩下就是简单的更新答案了. 所以复杂度是 ( n-1 ) ! * n*n #include <cstdio> #include <cstring>

51nod 1283 最小周长

一个矩形的面积为S,已知该矩形的边长都是整数,求所有满足条件的矩形中,周长的最小值.例如:S = 24,那么有{1 24} {2 12} {3 8} {4 6}这4种矩形,其中{4 6}的周长最小,为20. Input 输入1个数S(1 <= S <= 10^9). Output 输出最小周长. Input示例 24 Output示例 20水题.. #include <algorithm> #include <iostream> #include <cstring

ACM已知面积求最小周长

Description There is a piece of paper in front of Tom, its length and width are integer. Tom knows the area of this paper, he wants to know the minimum perimeter of this paper. Input In the first line, there is an integer T indicates the number of te