zoukankan      html  css  js  c++  java
  • (step4.1.2)hdu 1969(Pie——二分查找)

    题目大意:n块馅饼分给m+1个人,每个人的馅饼必须是整块的,不能拼接,求最大的。


    解题思路:

    1)用总饼的体积除以总人数,得到每个人最大可以得到的V.但是每个人手中不能有两片或多片拼成的一块饼。


    代码如下:

    /*
     * 1969_2.cpp
     *
     *  Created on: 2013年8月14日
     *      Author: Administrator
     */
    
    
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    
    double V[10001];
    int N,F;
    
    //PI尽量用反余弦函数来算,否则可能精度不够
    const double PI = acos(-1.0);
    
    /**
     * 输入饼的面积,判断能否够分
     * 若以此面积分割后所得的饼的块数>=人数,则够分
     * 否则不够分
     */
    bool test(double x){
    
    	//num .用来记录三块大馅饼最终能分成多少个小馅饼
    	int num = 0;
    	int i;
    	for( i = 1 ; i <= N ; ++i){
    
    		//V[i]/x 。计算每块馅饼能分成多少个小馅饼.其中的int体现了"每个人手中的馅饼不能是拼接而成的"
    		num +=  int(V[i]/x);
    	}
    
    	 //判断小馅饼数与朋友数的大小
    	if( num >= F){
    		return true;
    	}else {
    		return false;
    	}
    }
    
    int main(){
    
    	int t;
        scanf("%d",&t);
        while(t--){
        	memset(V,0,sizeof(V));
        	scanf("%d%d",&N,&F);
    
        	F = F+1;
        	int i;
        	double sum = 0;
        	for( i = 1 ; i <= N ; ++i){
        		int r;
        		scanf("%d",&r);
        		V[i] = PI*r*r;
        		sum += V[i];
        	}
    
        	double max = sum/F;
    
        	double l = 0;
        	double r = max;
        	double mid ;
        	while( r - l > 1e-6){//注意这里的精度问题
        		mid = (r+l)/2;
    
        		if(test(mid)){
        			l = mid;
        		}else{
        			r = mid;
        		}
        	}
    
        	printf("%.4lf
    ",(l+r)/2);
    
    
        }
    }
    
    
    


    
    
    


  • 相关阅读:
    返回一个整数数组中子数组的最大值
    软工概论第二周个人项目四则运算二(改进)
    构建之法阅读笔记01
    单例模式
    .net基础加强
    使用jquery easy ui
    抽象工厂类
    System.Linq.Expressions.Expression
    创建上下文对象
    DBSesson
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3258032.html
Copyright © 2011-2022 走看看