#include<stdio.h>
#include<stdlib.h>//包含快速排序的頭文件
#include<math.h>//數學函數頭文件
double length(double r)//將R轉換成有效值
{
return 2 * sqrt((double)(r * r - 1)); 此處不理解 請大神解釋 為什么要減1
}
int com(const void *a,const void *b)//快速排序比較函數
{
return (*(double *)b - *(double *)a > 0 ? 1 : -1);//從大到小排序
}
int main()
{
int m,n,i,j = 0;//j統計滿足>1的裝置個數
double r[1020],temp,sum=0.0;//存儲每個滿足條件的可濕潤范圍
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
for(i = 0,j = 0; i < n; i ++)
{
scanf("%lf",&temp);
if(temp > 1) //因為草坪的寬度為2米 所以舍棄半徑小于等于1的裝置
r[j++] = length(temp);
}
qsort(r,j,sizeof(r[0]),com); //qsort排序函數:r為要排序的數組、j為要排序的數組的長度、sizeif(r[0])為數組元素的大?。ㄒ粋€字節為單位)
//com為上面定義的判斷大小函數的指針,需要自己定義
//for(i = 0; i < j; i ++)測試用
// printf("%.2f ",r[i]);
for(i = 0,sum = 0;i < j; i ++){
sum += r[i]; //sum存儲裝置所能濕潤的長度
if(sum >= 20) //如果sum大于或等于20,說明已經濕潤完畢
break;
}
printf("%d\n",i + 1);
//輸出時加1,對應和i的關系,假如i=0是即退出循環,說明1個裝置即可完成任務,此時可以看出需要裝置個數和i之間的關系
}
system("pause");
return 0;
}
- 1 回答
- 0 關注
- 1006 瀏覽
添加回答
舉報
0/150
提交
取消