这道题目是水题,刷刷水题,练习c++
喷水装置(一)
时间限制: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
1 #include<iostream> 2 #include<algorithm> 3 #include <math.h> 4 using namespace std; 5 6 int main(){ 7 int m; 8 freopen("6.txt","r",stdin); 9 cin>>m; 10 while(m--){ 11 int n; 12 cin>>n; 13 float a[n]; 14 for(int i=0;i<n;i++) 15 cin>>a[i]; 16 sort(a,a+n); 17 18 float sum=0,count=0; 19 for(int i=n-1;i>=1;i--){ 20 if(a[i]>=1&&sum<20){ 21 sum+=2*sqrt(a[i]*a[i]-1); 22 count++; 23 } 24 } 25 cout<<count<<endl; 26 } 27 28 return 0; 29 }
相交圆的弦什么时候最短非常有意思,正好构成了一个直角三角形。
1 #include<iostream> 2 #include<vector> 3 #include<functional> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 double Length(double R,double b) 8 { 9 return 2*sqrt(R*R-b*b/4); 10 } 11 int main() 12 { 13 const double l=20,w=2; 14 int n; 15 cin>>n; 16 while(n--) 17 { 18 int m; 19 cin>>m; 20 double R; 21 vector<double> Rs; 22 while(m--) 23 { 24 cin>>R; 25 Rs.push_back(R); 26 } 27 sort(Rs.begin(),Rs.end(),greater<double>()); 28 double sum=0; 29 int i; 30 for(i=0;i!=Rs.size();i++) 31 { 32 if (sum>l) break; 33 sum+=Length(Rs[i],w); 34 } 35 cout<<i<<endl; 36 } 37 }