描述 现有一块草坪,长为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
算法:
直接上图吧,一看就明白了~
package penshui; import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); // System.out.println("请输入有几组测试数据"); int num = input.nextInt(); int[] pentounum = new int[num]; double[][] banjing = new double[num][]; for(int index = 0; index < num; index++) { // System.out.println("请输入"+(index+1)+"组有多少个喷头"); pentounum[index] = input.nextInt(); banjing[index] = new double[pentounum[index]]; System.out.println("请输入"+pentounum[index]+"组喷水装置所能覆盖的半径"); for(int i = 0; i < pentounum[index]; i++) { banjing[index][i] = input.nextDouble(); } } cal(banjing); out(banjing); } public static int out(double a[][]) { int ret = 0; int row = a.length; // Scanner input = new Scanner(System.in); for(int i = 0; i < row; i++) { int column = a[i].length; double sum = 0; for(int index = 0; index < column; index++) { sum = sum + Math.sqrt(a[i][index]*a[i][index]-1); if(sum >= 10) { System.out.println(index+1); break; } } } return ret; } public static int cal(double a[][]) { int ret = 0; int row = a.length; for(int m = 0; m < row ; m++) { int bb = a[m].length; for(int xx = 0; xx < bb; xx++) { // double max = a[m][xx]; for(int yy = xx + 1; yy < bb; yy ++) { if(a[m][yy] > a[m][xx]) { double temp = a[m][xx]; a[m][xx] = a[m][yy]; a[m][yy] = temp; } } } } return ret; } }