题目描述:
小赛家有一块草坪,长为20米,宽为2米,妈妈要他给草坪浇水,在草坪上放置半径为Ri的喷水装置,每个喷水装置可以给以它为中心的半径为实数Ri(1<Ri<15)的圆形区域浇水。他家有充足的喷水装置i(1<i<600)个,并且一定能把草坪全部湿润。你能帮他计算一下,把整个草坪全部湿润,最少需要几个喷水装置。
输入:输入第一个数字为喷水装置的个数n,后面n个数字分别为n个喷水装置的半径r,r表示该喷水装置能覆盖的圆的半径。
喷水装置i的范围为:1<i<600,半径的范围为:1<Ri<15。
输出:输出所用装置的个数。
样例输入
5
2 3.2 4 4.5 6
样例输出
2
题解:这道题其实很简单,之所以写出来是因为这道题犯了错误,下面来看看错误示范的代码:
import java.util.Arrays;
import java.util.Scanner;
public class Sprink {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
double[] sprinkler = new double[n];
for (int i = 0; i < n; i++)
sprinkler[i] = scanner.nextDouble();
Arrays.sort(sprinkler);
int count = 0;
double r = 0;
for (int i = n - 1; i >= 0; i--) {
r += sprinkler[i]; //错在这个地方!!
count++;
if (r >= 10)
break;
}
System.out.println(count);
}
}
为什么错?因为喷水的区域是一个圆,而草坪确是一个长方形!下面的才是正确代码:
import java.util.*;
import java.io.*;
public class Sprink {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = 0;
n = cin.nextInt();
double[] r = new double[n];
int i = 0;
while (cin.hasNextDouble()) {
r[i++] = cin.nextDouble();
}
Arrays.sort(r);
double length = 0;
int num = 0;
for (int j = n - 1; j >= 0; j--) {
length += Math.sqrt(r[j] * r[j] - 1);
num++;
if (length >= 10.0)
break;
}
System.out.println(num);
}
}