蓝桥杯分巧克力【第八届】【省赛】【B组】AC代码
小白花了1天时间写的。第一次12分,第二次62分,第三次100分!
第一次分析的时候没有注意到不是每块巧克力都需要被切分。
第二次求每块巧克力能被切分成多少小块的算法错误,我刚开始用了S1/S2的方法,与实际不符,第三次改用(c/len)*(k/len)算法终于全部成功了。
第一次自己做这种题目AC。有点小开心。说明:可以删去重写的Comparable和Arrays.sort§代码,自己找出输入巧克力的最大边长,然后以这个最大值作为初始值开始尝试。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static class pair implements Comparable<pair>{
int h;
int w;
public pair() {
super();
}
public pair(int h, int w) {
super();
this.h = h;
this.w = w;
}
@Override
public int compareTo(pair o) {
// TODO Auto-generated method stub
if(this.h==o.h)
return w-o.w;
else
return h-o.h;
}
}
public static int qiefen(int len,int c,int k)
{
return (c/len)*(k/len);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int n,k;int max;int fen;int cnt=0;
Scanner sc=new Scanner(System.in);
n=sc.nextInt();k=sc.nextInt();
pair p[]=new pair[n];
int s[]=new int[n];
for(int i=0;i<n;i++)
{
pair py=new pair(sc.nextInt(),sc.nextInt());
p[i]=py;
}//for
Arrays.sort(p);
max=Math.max(p[n-1].h, p[n-1].w);//max代表最大的被切分的巧克力的最大边长
boolean flag=true;
while(flag) {
for(int i=n-1;i>=0;i--)
{
pair pb=p[i];
int duan=Math.min(pb.h, pb.w);
int chang=Math.max(pb.h, pb.w);
if(max<=duan)//判断这块巧克力是否可以切分
cnt=cnt+qiefen(max,chang,duan);
else continue;//找到可以被切分的巧克力
if(cnt>=k) {System.out.println(max);flag=false;break;}
}//for
//System.out.println(max);
if(--max<0) break;
cnt=0;
}//while
}
}
