POJ3122 pie

题目大意:就是给出n个馅饼,f个party朋友,问分给每个人多少面积的馅饼,才使得f+1(包括party主人----我)个人得到的馅饼面积最大。分割的规则是:每个人得到的馅饼仅来自一个馅饼。这也就是说不是一般的总和再平均的问题。

思路:呜呜~~小增的第一道统计二分啊~~惭愧~~本题二分的上限是最大的馅饼的半径的平方(我是用馅饼的半径的平方处理的)。还是说一下为什么用二分吧,因为分馅饼是一个实数问题,如果用二分来枚举,速度还不错。。

AC program:

#include<iostream>
#include<iomanip>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int test,n,f,pp;
double mm[10005];
double low,high,mid;
double pi=acos(-1.0);  
int main()
{
scanf("%d",&test); 
while(test--)
{
  scanf("%d%d",&n,&f); 
  pp=f+1; 
  low=0;
  high=-1;
  double tmp; 
  for(int i=0;i<n;i++)
   {    
        
           scanf("%lf",&tmp); 
           mm[i]=tmp*tmp;/// 
           if(mm[i]-high>0.0000001)
                high=mm[i]; 
   }
  while(high-low>0.0000001)
  {
    mid=(low+high)/2; 
    int cnt=0; 
    for(int i=0;i<n;i++)
    {
      if(mm[i]-mid>0.0000001)//这个小数不要太小,太小就超时了,我勒个去 
      { 
          cnt+=(int)(mm[i]/mid);
      }      
    }
    if(cnt<pp)
       high=mid;
    else
       low=mid; //如果一时没想起相等和谁一起,那就先顺着大大小小来先。。
                                 
  } 
  printf("%.4lf\n",pi*mid); 
  //cout<<fixed<<setprecision(4)<<mid*pi<<endl;      
               
}
//system("pause");    
return 0;} 


 

 

小优的博客解释的很清楚:http://blog.csdn.net/lyy289065406/article/details/6648565

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值