噴水裝置(一)(貪心)
噴水裝置(一)
時間限制: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;
}