NYOJ 6 喷水装置(一)
/*
题目大意: 在长为20米,宽为2米的草坪中心线上(注意是中心线)放置半径为Ri的喷水装置。
求满足草坪全部湿润的情况下(覆盖的长度>=20),最少使用多少喷水装置。
*/
每个喷水装置覆盖的范围如图:
情况一:半径<=1的喷水装置覆盖的长度为0,半径<=1的喷水装置应该摒弃。 情况二:喷水装置的覆盖范围为 = 2*x = 2*sqrt(R*R-1);
- #include<cstdio>
- #include<cmath>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- int cmp(double a,double b)
- {
- return a>b;
- }
- double f(double R) //求出每个喷水装置覆盖的长度
- {
- return 2*sqrt( (double)(R*R-1) );
- }
- int main()
- {
- int T,m,i,k;
- double sum,t,a[1010];
- scanf("%d",&T);
- while(T--)
- {
- memset(a,0,sizeof(a));
- scanf("%d",&m);
- for(i=0,k=0; i<m; i++)
- {
- scanf("%lf",&t);
- if(t>1)
- a[k++] = t;//将半径大于一的喷水装置存入数组,装置个数为k。
- }
- sort(a,a+k,cmp); //快排,将喷水装置的覆盖长度,由大到小排序
- for(i=0,sum=0.0; i<k; i++)
- {
- sum+=f(a[i]);
- if(sum>=20.0)
- {
- break;
- }
- }
- printf("%d\n",i+1);
- }
- return 0;
- }