您的位置:首页 > 其它

day2 HDU 1969 Pie

2016-07-22 09:32 302 查看
#include"iostream"
#include"iomanip"
using namespace std;
const double PI=3.14159265358979;
int t,n,f,sum;
double maxx;
double s[10005];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>f;
maxx=0;
for(int i=0;i<n;i++) { cin>>s[i];  s[i]=s[i]*s[i]; maxx+=s[i]; }
f++;
double l,r,mid;
l=0; r=maxx/f;
while((r-l)>0.000001)
{
mid=(l+r)/2.0;
sum=0;
for(int i=0;i<n;i++) sum+=(int)(s[i]/mid);
if(sum>=f) l=mid;
else r=mid;

}
//cout<<mid<<endl;
cout<<fixed<<setprecision(4)<<mid*PI<<endl;
}
return 0;
}
二分求解能获得的最大体积,二分区间为期望的下限和上限。因为在求解出答案后还要对答案进行必要的计算才能判断是否符合条件,所以直接划分区间找答案。除此之外,题目精度有一定的要求,所以在写程序的时候,对于PI这种常识性数字,还是尽量取的越精细越好,对于二分精度的设定,也要进行一些必要的尝试和摸索。另外在条件判断中用s[i]/mid来确定每个派能分几份,这个结果应该是舍去小数的,如果直接从double赋给int貌似会进行四舍五入,导致结果WA,在加上(int)强制转换后能AC,要记住这一点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: