1. 程式人生 > >噴水裝置(一)(貪心)

噴水裝置(一)(貪心)

噴水裝置(一)

時間限制:3000 ms  |  記憶體限制:65535 KB

難度:3

描述

現有一塊草坪,長為20米,寬為2米,要在橫中心線上放置半徑為Ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數Ri(0<Ri<15)的圓被溼潤,這有充足的噴水裝置i(1<i<600)個,並且一定能把草坪全部溼潤,你要做的是:選擇儘量少的噴水裝置,把整個草坪的全部溼潤。

輸入

第一行m表示有m組測試資料
每一組測試資料的第一行有一個整數數n,n表示共有n個噴水裝置,隨後的一行,有n個實數ri,ri表示該噴水裝置能覆蓋的圓的半徑。

輸出

輸出所用裝置的個數

樣例輸入

2
5
2 3.2 4 4.5 6 
10
1 2 3 1 2 1.2 3 1.1 1 2

樣例輸出

2
5

 

之前錯誤的想法直接用直徑加起來就好了,畫了圖可以看到實際上不能完全覆蓋 如圖

 

自制圖(圖畫的不是很準):

AC程式碼:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//double cmp(const void*a,const void*b){  本來想快排的結果發現學校的編譯器一直報錯就用個冒泡了 
  //  return *(double *)a-*(double *)b;    
//}
int main(){
    int T=0;
    scanf("%d",&T);
    while(T--){
       int n=0;
       scanf("%d",&n);
       int i=0;
       double ps[610];
       for(i=0;i<n;i++){
          scanf("%lf",&ps[i]);
       }
       for(i=0;i<n-1;i++){//從大到小排序 
           for(int j=0;j<n-i-1;j++){
               if(ps[j]<ps[j+1]){
                   double temp=ps[j];
                   ps[j]=ps[j+1];
                   ps[j+1]=temp;
               }
           }
       }
       i=0;
       double len=20.0;
       while(len>0 && ps[i]>1 && i<n){//同時滿足條件剩下的長度>0  寬為2要放中間 半徑要大於1否則沒有意義      
            len=len-(sqrt(ps[i]*ps[i]-1.0)*2);
            i++;
       }
       printf("%d\n",i);
               
    }
    
        
    return 0;
}