1. 程式人生 > >無線網路覆蓋-java中,用Math.sqrt()時,必須要注意小數問題

無線網路覆蓋-java中,用Math.sqrt()時,必須要注意小數問題

時間限制: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");    }}