無線網路覆蓋-java中,用Math.sqrt()時,必須要注意小數問題
阿新 • • 發佈:2018-12-11
時間限制:3000 ms | 記憶體限制:65535 KB
難度:3
- 描述
-
我們的樂樂同學對於網路可算得上是情有獨鍾,他有一個計劃,那就是用無線網覆蓋鄭州大學。
現在學校給了他一個機會,因此他要購買很多的無線路由。現在他正在部署某條大道的網路,而學校只允許把他的無線路由器放在路的正中間。我們預設這條大道是筆直的並且它在任何地方的寬度都一樣。並且所有的路由器的覆蓋面積是相同的。現在樂樂計算出這條大道的長和寬,以及路由器的覆蓋半徑,想請你幫忙,幫他計算出他最少要購買的路由器的數量。
注意:為了防止某種干擾,兩臺無線路由之間的最小距離不能小於1米
圖1中為一條矩形的道路,中間的虛線代表中線。圖2為最小覆蓋的示意圖。
- 輸入
- 輸入包括多組測試資料 第一部分:一個整數T(1<=T<=500) 第二部分:一共T行,每行包括三個整數L,D,R代表路的長,寬和覆蓋半徑(米)。 (1<=L<=100000),(1<=D<=50),(1<=R<=200)。
- 輸出
- 對於每組測試資料輸出各佔一行,只有一個整數,表示最少的路由器數量。如果不能覆蓋,請輸出impossible
- 樣例輸入
-
2 40 6 5 40 10 5
- 樣例輸出
-
5 impossible程式碼實現如下:package package111;import java.util.Arrays;import java.util.Scanner;public class Main{ public static void main(String []args) { Scanner cin = new Scanner(System.in); int T; T = cin.nextInt(); int L,D,R; for(int i = 0 ; i < T ; i++) { L = cin.nextInt(); D = cin.nextInt(); R = cin.nextInt(); Print(L,D,R); } } static void Print(int L,int D,int R) { if(R*2 <= D) { System.out.print("impossible" + "\n"); return; } double sum = Math.sqrt((R*R*1.0)-D*D*1.0/4);//這裡才是重點,必須乘1.0,不然小數部分計算,肯定會出錯 if(sum < 0.5) { System.out.print("impossible" + "\n"); return; } sum = sum*2; double cnt = L*1.0/sum; int a = (int)cnt; if(cnt - a > 0) { a++; } System.out.print(a + "\n"); }}