現有一塊草坪,長為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的值經歷了一次內循環後會變大呢?請各位老師指點,謝謝
你的pour[]數組**長度只有1**啊,除了pour[0]是合法的,用其他下標訪問的pour[h]都**越界**了。
所以只要初始的n不是1,scanf("%lf",&pour[h])會把後面的n、num、len逐個覆蓋掉。