NYOJ 6.喷水装置(一)-贪心

时间:2023-03-09 14:36:50
NYOJ 6.喷水装置(一)-贪心

喷水装置(一)

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
  现有一块草坪,长为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
 

题意也是浇水,不过这个题浇水装置的位置没有确定,所以比上面的那道题水,而且精度上也没啥要求。

唯一让我感觉神奇的就是我定义的1000的数组竟然RuntimeError了!?

把数组定义到main函数前面(宏定义)就可以了,1000的数组是个大数组?简直神一般的操作。。。

代码:

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1000;
4 bool cmp(int a,int b){
5 return a>=b;
6 }
7 int t,n,ans;
8 double cnt,l,a[N],b[N];
9 int main(){
10 scanf("%d",&t);
11 while(t--){
12 l=20;
13 scanf("%d",&n);
14 for(int i=0;i<n;i++)
15 scanf("%lf",&a[i]);
16 sort(a,a+n,cmp);
17 ans=0;
18 for(int i=0;i<n;i++)
19 b[i]=2*sqrt(a[i]*a[i]-1);
20 for(int i=0;i<n;i++){
21 if(b[i]>0){
22 if(l>0.0){
23 l-=b[i];
24 ans++;
25 }
26 }
27 }
28 printf("%d\n",ans);
29 }
30 return 0;
31 }