程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 10012 - How Big Is It?

10012 - How Big Is It?

編輯:C++入門知識

[cpp]
描述:好麻煩的題目,准確的說就是給定m個圓的半徑, 
現在要求找到一個矩形使得每一個球都以地面相切, 
要求輸出最小的矩陣的長度 
#include <cstdio> 
#include <cmath> 
#include <cstring> 
int n,m,j,flag[12]; 
double count,num[10],p[10],value[10]; 
void dfs(int cur,double x,double y) 

    if(cur>=m) 
    { 
        if(!flag[10]) count=y-x; 
        else if(y-x<count) count=y-x; 
        flag[10]=1; 
        return ; 
    } 
    for(int i=0; i<m; i++) 
        if(!flag[i]) 
        { 
            flag[i]=1; 
            p[cur]=num[i]; 
            value[cur]=0; 
            for (j=0; j<cur; j++) 
            { 
                double c=sqrt((p[cur]+p[j])*(p[cur]+p[j])-(p[cur]-p[j])*(p[cur]-p[j]))+value[j]; 
                if (c>value[cur]) value[cur]=c; 
            } 
            double a,b; 
            if(value[cur]-p[cur]<x) a=value[cur]-p[cur]; 
            else a=x; 
            if(value[cur]+p[cur]>y) b=value[cur]+p[cur]; 
            else b=y; 
            dfs(cur+1,a,b); 
            flag[i]=0; 
        } 

int main() 

#ifndef ONLINE_JUDGE 
    freopen("a.txt","r",stdin); 
#endif 
    scanf("%d",&n); 
    while(n--) 
    { 
        scanf("%d",&m); 
        count=0; 
        for(int i=0; i<m; i++) scanf("%lf",&num[i]); 
        memset(flag,0,sizeof(flag)); 
        memset(value,0,sizeof(value)); 
        if(m>1) for(int i=0; i<m; i++) 
            { 
                flag[i]=1; 
                value[0]=p[0]=num[i]; 
                double a=value[0]-p[0]; 
                double b=value[0]+p[0]; 
                dfs(1,a,b); 
                flag[i]=0; 
            } 
        else count=2*num[0]; 
        printf("%.3lf\n",count); 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved