Uva12097 Pie

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3249

题目大意:F+1个人来分N个圆形派,每个人得到的必须是一个整块,不能是几个拼起来的,面积要相同。求每个人能得到派的最大面积。


解题关键:将问题转化为“是否可以让每个人获得一个面积为x的派”,对所有派的面积进行二分,假设得到面积x,按照每块x的大小来分,若可以切得的块数>=F+1,ans>=x;若块数小于F+1,ans<x;

注意这是double上的二分,注意控制条件!


import java.util.Scanner;


public class Main {

	/**
	 * @param args
	 */
	static double[] radii=null;
	static int num_pie,num_fri;
	static boolean OK(double M)
	{
		int sum=0;
		for(int i=0;i<radii.length;i++)
		{
			if(radii[i]>M) 
			{
				int temp=(int)Math.floor(radii[i]/M);
				sum+=temp;
			}
		}
		if(sum>=num_fri+1) return true;
		return false;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n;
		Scanner in=new Scanner(System.in);
		n=in.nextInt();
		for(;n>0;n--)
		{
			num_pie=in.nextInt();
			num_fri=in.nextInt();
			radii=new double[num_pie];
			double max=Double.MIN_VALUE;
			double min=Double.MAX_VALUE;
			for(int i=0;i<num_pie;i++)
			{
				int temp=in.nextInt();
				radii[i]=Math.PI*temp*temp;
				if(radii[i]>=max)
					max=radii[i];
			}
			
			double L=0,R=max,M;
			while(R-L>1e-5)
			{
				M=L+(R-L)/2;
				if(OK(M))
				{
					L=M;
				}
				else
				{
					R=M;
				}
			}
			System.out.printf("%.4f\n",L);
		}
	}

}


你可能感兴趣的:(Uva12097 Pie)