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 }

 

posted @ 2017-07-20 15:43  ZERO-  阅读(189)  评论(0编辑  收藏  举报