/*
* 程序的版权和版本声明部分:
* Copyright (c) 2014,郑州大学SIAS国际学院
* 作 者: 王 杰
* 完成日期:2014 年 3 月 19 日
*
* 对任务及求解方法的描述部分:
* 输入描述: 略或见注释、总结
* 问题描述: 略或见注释、总结
* 程序输出: 略或见注释、总结
* 问题分析: 略或见注释、总结
* 算法设计: 略或见注释、总结
*/
#include<stdio.h>
#include<math.h>
//类比打牌的摸牌阶段,key代表待排序的数。插入排序insert sort
void insert_sort(double arr[],int length)
{
int i,j;
double key;
for(j=1;j<length;j++){ //每次循环代表要插入的数key,共有n-1个key需要插入(排序)
//1、这两句是每次key插入之前的准备工作
key=arr[j];
i=j-1;
//2、找出key要插入的位置,并把位置腾出来
while(i>=0 && arr[i]>key){
arr[i+1]=arr[i];
i--;
}
//3、把key插入到合适的位置上
arr[i+1]=key;
}
}
int main()
{
int m,n,i,count;
scanf("%d",&m);
while(m--){
double l=20.0;
count=0;
scanf("%d",&n);
double r[n];
for(i=0;i<n;i++)
scanf("%lf",&r[i]);
//for(i=0;i<n;i++)
//printf("%lf ",r[i]);
insert_sort(r,n);
//for(i=n-1;i>=0;i--)
//printf("%lf ",r[i]);
i=n-1;
while(l>0.0 && i>=0){ //把l定义成double型的,并且和0.0比较,这样l的精度就不会丢失
l=l-2*sqrt(r[i]*r[i]-1);
i--;
count++;
}
printf("%d\n",count);
}
return 0;
}
运行结果:
总结:对数据的精度的考虑;贪心
STL版:
#include<iostream>
#include<vector>
#include<functional>
#include<algorithm>
#include<cmath>
using namespace std;
double Length(double R,double b)
{
return 2*sqrt(R*R-b*b/4);
}
int main()
{
const double l=20,w=2;
int n;
cin>>n;
while(n--){
int m;
cin>>m;
double R;
vector<double> Rs;
while(m--){
cin>>R;
Rs.push_back(R);
}
sort(Rs.begin(),Rs.end(),greater<double>());
double sum=0;
int i;
for(i=0;i!=Rs.size();i++){
if (sum>l) break;
sum+=Length(Rs[i],w);
}
cout<<i<<endl;
}
return 0;
}