题目链接: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);
}
}
}

本文解决UVA 12674题目中的分圆派问题,利用二分查找算法确定每个人能获得的最大派面积。通过调整面积大小,确保每个人都能分得完整且面积相等的一块。
418

被折叠的 条评论
为什么被折叠?



