现在的位置: 首页 > 综合 > 正文

hdu 5135 Little Zu Chongzhi’s Triangles 2014ACM/ICPC亚洲区广州站-重现赛

2018年01月14日 ⁄ 综合 ⁄ 共 1449字 ⁄ 字号 评论关闭

感觉自己直接暴力枚举三条边的做法真是丑哭了。

dfs生成组合,然后计算面积。

#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include<ctype.h>
#include<map>
#include<time.h>
#include<bitset>
using namespace std;
//hdu 5135

const int maxn=13;
int N;
double len[maxn];
int ed;
int g[4][3];
double ans;
bool used[maxn];
bool judge(double a,double b,double c)
{
    if(a<(b+c)&&b<(a+c)&&c<(a+b))
    {
        if(a>abs(b-c)&&b>abs(a-c)&&c>abs(a-b))
        {
            //cout<<a<<" "<<b<<" "<<c<<endl;
            return true;
        }
    }
    return false;
}
double area(double a,double b,double c)
{
    double h=(a+b+c)/2.0;
    double s=sqrt(h*(h-a)*(h-b)*(h-c));//三角形面积的海伦公式
    return s;
}
void cal()
{
    double ar=0;
    for(int i=0;i<ed;i++)
    {
        int x=g[i][0];
        int y=g[i][1];
        int z=g[i][2];
        double a=len[x];
        double b=len[y];
        double c=len[z];
        if(judge(a,b,c))
        {
            ar+=area(a,b,c);
        }
    }
    ans=max(ans,ar);

}
int dep;
void dfs(int x,int y,int begin)
{
    if(x>=ed)
    {
        cal();
//        for(int i=0;i<ed;i++)
//        {
//            for(int j=0;j<3;j++)
//            {
//                cout<<g[i][j]<<" ";
//            }
//        }
//        cout<<endl;
//        cout<<(dep++)<<endl;
        return;
    }
    if(y>=3)
    {
        dfs(x+1,0,1);
    }
    else
    {
         for(int i=begin;i<=N;i++)
        {
            if(used[i]==1) continue;
            g[x][y]=i;
            //cout<<"set: "<<x<<" "<<y<<" "<<g[x][y]<<endl;
            used[i]=1;
            dfs(x,y+1,i+1);
            used[i]=0;
        }
    }

}
int main()
{
    freopen("input.txt","r",stdin);
    //freopen("data.txt","r",stdin);
    //freopen("out1.txt","w",stdout);
    while(true)
    {
        scanf("%d",&N);
        if(N==0)
        {
            break;
        }
        ed=N/3;
        for(int i=1;i<=N;i++)
        {
            scanf("%lf",&len[i]);
        }
        memset(used,0,sizeof(used));
        ans=0;
        dfs(0,0,1);
        printf("%.2lf\n",ans);
    }
    return 0;
}



抱歉!评论已关闭.