⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soj1740排列树回溯.cpp

📁 一些ACM题目的解答,主要是soj和poj的
💻 CPP
字号:
#include<cstdio>
#include<cmath>

double x[10];
double radius[10];
double min;
int n;

void Swap(double &a,double &b)
{
    double t = a;
    a=b;
    b=t;
}

double center(int t)
{
    double result = 0;
    int i;
    for( i=0 ;i<t;i++)
    {
        double valuex = x[i] + 2.0 * sqrt(radius[i]*radius[t]);
        if(valuex > result)
            result = valuex;
    }
    return result;
}
void Compute(void)
{
    double low =0, high=0;
    for(int i=0;i<n;i++)
    {
        if(x[i]-radius[i]<low)
            low=x[i]-radius[i];
        if(x[i]+radius[i]>high)
            high=x[i]+radius[i];
    }
    if(high-low<min)
        min=high-low;
}

void backtrack(int t)
{
    if(t>=n)
        Compute();
    else
        for(int j=t;j<n;j++)
        {
            Swap(radius[j],radius[t]);
            double centerx = center(t);
            if(centerx+radius[t]+radius[0]<min)
            {
                x[t]=centerx;
                backtrack(t+1);
            }
            Swap(radius[t],radius[j]);
        }
}
int main(void)
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int i;
        for(i=0;i<n;i++)
            scanf("%lf",&radius[i]);
        min = 1e200;
        backtrack(0);
        printf("%.3lf\n",min);
    }
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -