uva10012 - How Big Is It?

看到这个题,很快的就敲出了全排列的递归程序,结果一直WA。。。。

看人家的代码都没看明白,直到看到人家的解释才懂了。。。无语。。。

原来自己想的情况太理想化了,没有考虑到特大圆,与特小圆存在的特例。

如果一味的按照顺序相切下去,有可能存在与前面的大圆相交的情况。

代码是在原来基础上改的,先贴以一下吧。

代码如下:

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
double radii[10], recoder[10], MIN;
int comp(const void *a, const void *b)
{
    return *(double*)a>*(double*)b;
}
double return_length(double a, double b)
{
    return sqrt((a+b)*(a+b)-(a-b)*(a-b));
}
void cacultor(int n, int cur)
{
    if(cur==n)
    {
        double max = 0;
        for(int i = 0; i < n; i++) max = max<recoder[i]+radii[i]?recoder[i]+radii[i]:max;
        if(MIN<0||MIN>max)MIN = max;
        return;
    }
    double diet;
    for(int i = 0; i < cur; i++)
    {
        diet = return_length(radii[i],radii[cur])+recoder[i];
        if(diet>recoder[cur]) recoder[cur] = diet;
    }
    cacultor(n, cur+1);
}
int main ()
{
    int t, n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i = 0; i < n; i++) scanf("%lf",&radii[i]);
        qsort(radii,n,sizeof(radii[0]),comp);
        MIN = -1;
        do
        {
            for(int i = 0; i < n; i++) recoder[i] = radii[i];
            cacultor(n, 1);
        }
        while(next_permutation(radii,radii+n));
        printf("%.3lf\n",MIN);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值