资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。
为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:
1. 形状是正方形,边长是整数
2. 大小相同
例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。
当然小朋友们都希望得到的巧克力尽可能大,你能帮小Hi计算出最大的边长是多少么?
输入格式
第一行包含两个整数N和K。(1 <= N, K <= 100000)
以下N行每行包含两个整数Hi和Wi。(1 <= Hi, Wi <= 100000)
输入保证每位小朋友至少能获得一块1x1的巧克力。
输出格式
输出切出的正方形巧克力最大可能的边长。
样例输入
2 10
6 5
5 6
样例输出
2
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。
为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:
1. 形状是正方形,边长是整数
2. 大小相同
例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。
当然小朋友们都希望得到的巧克力尽可能大,你能帮小Hi计算出最大的边长是多少么?
输入格式
第一行包含两个整数N和K。(1 <= N, K <= 100000)
以下N行每行包含两个整数Hi和Wi。(1 <= Hi, Wi <= 100000)
输入保证每位小朋友至少能获得一块1x1的巧克力。
输出格式
输出切出的正方形巧克力最大可能的边长。
样例输入
2 10
6 5
5 6
样例输出
2
思路详见代码注释
AC Code
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct ch{
int h,w,s;
}a[N];
int n,k;
int res,av;
int cmp(ch x,ch y){
return x.s>y.s;
}
int cnt;
void dfs(int h,int w,int x){
if(h>=x&&w>=x){
++cnt;//切巧克力,每次都能切成俩部分 继续把切出来的部分当作新的巧克力继续搜索
dfs(h-x,w,x);
dfs(w-x,x,x);
}
else return ;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].h,&a[i].w);
a[i].s=a[i].h*a[i].w;
res=max(res,min(a[i].h,a[i].w));//找到所有巧克力中,较小的长或者宽的最大值 作为枚举上限
}
sort(a+1,a+n+1,cmp);//降序排序
//能切则必须是长宽都>=正方形边长的
int flag=1,tcnt=0;
for(int i=res;i>=1;i--){//枚举正方形边长
flag=1,tcnt=0,cnt=0;//每次要记得初始化
for(int j=1;j<=n;j++){//以i为边长来切
if(a[j].h>=i&&a[j].w>=i){
dfs(a[j].h,a[j].w,i);
}
if(cnt>=k){//因为是从大的巧克力开始切,可能不用遍历所有巧克力,切的块数就已经够了
flag=i;
break;
}
}
if(flag!=1)break;
if(cnt>=k){//统计
flag=i;
break;
}
}
printf("%d",flag);
return 0;
}