现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1<i<600)个,并且一定能把草坪全部湿润,你要做的是:选择尽量少的喷水装置,把整个草坪的全部湿润。
输入
第一行m表示有m组测试数据
每一组测试数据的第一行有一个整数数n,n表示共有n个喷水装置,随后的一行,有n个实数ri,ri表示该喷水装置能覆盖的圆的半径。
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int sort(double arr[],int x)//定义一个插入排序,由大到小排。经测试该方法正确
{
double tem;
for(int i=1;i<x;i++)
{
for(int j=i;j>0;j--)
{
if(arr[j]>arr[j-1])
{
tem = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tem;
}
else
{
break;
}
}
}
return 0;
}
int main(void)
{
int m=0;
scanf("%d",&m);
int result[] = {0};//记录每组所需要的装置个数
double pour[] = {0};//记录初始输入的装置能覆盖的半径
int n;//表示最初由n个喷水装置
int num = 0;//最终需要的装置个数
double len = 20;//草坪长度
for(int i=0;i<m;i++)
{
scanf("%d",&n);
len = 20;//重新判断下一组所以要重新赋值
num = 0;//重新赋值
for(int h=0;h<n;h++)//依次输入各个值,空格间隔开
{
scanf("%lf",&pour[h]);
}
sort(pour,n);//将输入的半径由大到小排序
for(int j=0;j<n;j++)
{
len = len - 2*sqrt(pour[j]*pour[j]-1);
num++;//需求的装置曾一
if(len<0)
{
result[i] = num;
break;
}
}
}
for(int k=0;k<m;k++)
{
printf("%d\n",result[k]);
}
}
为什么n的值经历了一次内循环后会变大呢?请各位老师指点,谢谢