知识点:
- 二分法判断最大边长:
排除越界; while(min!=mid) { if() min=mid; else if() max=mid; else break;//(max-min=1); mid=min+(max-min)/2; }
代码如下:
package _2017;
import java.util.Scanner;
class cho
{
int x;
int y;
public cho(int x1,int y1)
{
x=x1;
y=y1;
}
}
public class Main9 {
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int k=sc.nextInt();
int maxLine=0;
cho[] a=new cho[n];
for(int i=0;i<n;i++)
{
int x=sc.nextInt();
int y=sc.nextInt();
a[i]=new cho(x,y);
maxLine=Math.max(Math.min(x, y),maxLine);//存储最大可以计算的边长
}
int min=1;
int max=maxLine;
int mid=(1+maxLine)/2;
while(min!=mid)//二分法:因为至少是1,则不考虑边长越界
{
int number = 0;
for(int i=0;i<n;i++)
{
number=number+(a[i].x/mid)*(a[i].y/mid);
}
if(number>k)
min=mid;
else if(number<k)
max=mid;
else
break;
mid=min+(max-min)/2;//mid=(min+max)/2容易越界
}
System.out.print(mid);
}
}