ZSTU3795-How Big is it?

http://acmpj.zstu.edu.cn/JudgeOnline/showproblem?problem_id=3795

淫荡的大圆旁边很小圆。。。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define len 10
double radius[len],r[len],x[len],min;
int n;
int cmp(const void *a,const void *b)
{
         return *(double *)a>*(double *)b?1:-1;
}
double dis(int past,int now)
{                          
         return x[past]+2*sqrt(r[past]*r[now]);               
}
void dfs(int cur,double num)
{
         int i,j,c1,c2;
         double max,length;
         if(cur==n)
         {
              if(min>num)
                min=num;
             return;
         }
         for(i=0;i<n;i++)
            if(!i||radius[i]!=radius[i-1])
            {
                c1=c2=0;
                for(j=0;j<n;j++)
                   if(radius[i]==radius[j])
                      c1++;
                for(j=0;j<cur;j++)
                   if(radius[i]==r[j])
                      c2++;
                if(c1>c2)
                {
                    r[cur]=radius[i];
                    if(cur)
                    {                              
                        for(j=0,max=0.;j<cur;j++)
                        {
                            length=dis(j,cur);
                            if(max<length)
                               max=length;
                        }
                        if(r[cur]>max)
                        {
                            for(j=0;j<cur;j++)
                               x[j]+=r[cur]-max;
                            x[cur]=r[cur];
                        }
                        else
                           x[cur]=max;
                    }
                    else
                       x[cur]=r[cur];
                    if(num<x[cur]+r[cur])                  
                       dfs(cur+1,x[cur]+r[cur]);
                    else
                       dfs(cur+1,num);
                   }
              }
}
int main(void)
{
    int cas,i;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
           scanf("%lf",&radius[i]);
        min=100000000.;
        qsort(radius,n,sizeof(radius[0]),cmp);
        dfs(0,0.0);
        printf("%.3lf\n",min);
    }
    return 0;
}

转载于:https://www.cnblogs.com/YogurtShen/archive/2012/08/29/2661858.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值