UVA - 10112 Myacm Triangles

UVA - 10112 Myacm Triangles

题目大意:给出4 - 10点, 求 面积最大的三角形 三角形内不能包含其他点
解题思路:数据量较小 可以暴力做, 然后判断点是否在三角形内 可以用 这个点 和 三角形的 每两条边 形成的三个三角形 的面积总和 是否和原三角形相等来判断

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
int cmp (const void *_a,const void *_b) {
    char *a = (char *)_a;
    char *b = (char *)_b;
    return strcmp(a,b);
}
int main() {
    int N;
    scanf("%d", &N);
    int flag ;
    double d1[100],d2[100];
    while ( N) {
        getchar();
        for (int i = 0; i < N; i++) {
            getchar();
            getchar();
            scanf("%lf%lf", &d1[i], &d2[i]);
        }
        double max = 0;
        char q[3];
        double a,b,c,p,s;
        for (int i = 0; i < N; i++)
            for (int j = i+1; j < N; j++)
                for (int k = j+1; k < N; k++) {
                    if ( i == j || i == k || j == k) continue;
                    a = sqrt((d1[i] -d1[j])*(d1[i]-d1[j])+(d2[i] -d2[j])*(d2[i]-d2[j])) ;
                    b = sqrt((d1[i] -d1[k])*(d1[i]-d1[k])+(d2[i] -d2[k])*(d2[i]-d2[k])) ;
                    c =  sqrt((d1[k] -d1[j])*(d1[k]-d1[j])+(d2[k] -d2[j])*(d2[k]-d2[j]));
                    p = ( a + b + c)/2;
                    s = sqrt(p*(p-a)*(p-b)*(p-c));
                    if ( s > max) { 
                        flag = 1;
                        for (int l = 0; l < N; l++) {
                            if (i == l || j == l || k == l) continue;
                            double d11 = sqrt((d1[i] -d1[j])*(d1[i]-d1[j])+(d2[i] -d2[j])*(d2[i]-d2[j]))    ;
                            double d22 = sqrt((d1[l] -d1[j])*(d1[l]-d1[j])+(d2[l] -d2[j])*(d2[l]-d2[j]))    ;
                            double d33 = sqrt((d1[i] -d1[l])*(d1[i]-d1[l])+(d2[i] -d2[l])*(d2[i]-d2[l]))    ;
                            double p1 = (d11 + d22 + d33)/2;
                            double s1 = sqrt(p1*(p1-d11)*(p1-d22)*(p1-d33));
                            double d4 = sqrt((d1[k] -d1[j])*(d1[k]-d1[j])+(d2[k] -d2[j])*(d2[k]-d2[j])) ;
                            double d5 = sqrt((d1[l] -d1[j])*(d1[l]-d1[j])+(d2[l] -d2[j])*(d2[l]-d2[j])) ;
                            double d6 = sqrt((d1[k] -d1[l])*(d1[k]-d1[l])+(d2[k] -d2[l])*(d2[k]-d2[l])) ;
                            double p2 = (d4 + d5 + d6)/2;
                            double s2 = sqrt(p2*(p2-d4)*(p2-d5)*(p2-d6));
                            double d7 = sqrt((d1[i] -d1[k])*(d1[i]-d1[k])+(d2[i] -d2[k])*(d2[i]-d2[k])) ;
                            double d8 = sqrt((d1[l] -d1[k])*(d1[l]-d1[k])+(d2[l] -d2[k])*(d2[l]-d2[k])) ;
                            double d9 = sqrt((d1[i] -d1[l])*(d1[i]-d1[l])+(d2[i] -d2[l])*(d2[i]-d2[l])) ;
                            double p3 = (d7 + d8 + d9)/2;
                            double s3 = sqrt(p3*(p3-d7)*(p3-d8)*(p3-d9));
                            if ( fabs(s-s1-s2-s3) < 1e-9 ) flag = 0;

                        }

                        if (flag) {
                            max = s;
                            q[0] = i+'A';
                            q[1] = j + 'A';
                            q[2] = k + 'A';
                            flag = 0;
                        }
                    }
                }

        qsort(q, 3, sizeof(q[0]), cmp);
        printf("%c%c%c\n", q[0],q[1], q[2]);
        scanf("%d", &N);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值