拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 分巧克力(刷题赛)

分巧克力(刷题赛)

白鹭 - 2022-01-26 1996 0 0

reference

#include<iostream>
#include<cstring>
using namespace std;
/*使得将巧克力按照边长maxX进行切分
,切分成的份数要大于等于K,
而如果按照maxX+1进行切割
,将不再能够切出K块,
如果从1-100000逐个查找,那么肯定超时,所以采用二分查找,
*/
int n,k,a[11000],b[110000];//a 4 high ,b 4 wide
bool ok(int x){
    int cnt=0;
    for (int i = 1; i <= n; i ++ ){
        cnt+=(a[i]/x)*(b[i]/x);//可以切割成的边长合理的正方形巧克力的块数
        if(cnt>=k){
            return true;
        }
    }
    return false;
}
int main()
{
	cin >> n >> k;
	for(int i = 1;i <= n;i++){
	    cin >> a[i]>>b[i];
	}
	int l = 0,r = 100000;
	while(l<=r){
	    int m = l/2+r/2;
	    if(ok(m)){
	        l=m+1;
	    }else{
	        r=m-1;
	    }
	}
	cout<<l-1<<endl;
	return 0;
}

题目描述
儿童节那天有 K 位小朋友到小明家做客,小明拿出了珍藏的巧克力招待小朋友们,

小明一共有 NN 块巧克力,其中第 ii 块是 H_i \times WiH
i
?
×Wi 的方格组成的长方形,为了公平起见,

小明需要从这 NN 块巧克力中切出 K 块巧克力分给小朋友们,切出的巧克力需要满足:

形状是正方形,边长是整数;

大小相同;

例如一块 6x5 的巧克力可以切出 6 块 2x2 的巧克力或者 2 块 3x3 的巧克力,

当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少幺?

输入描述
第一行包含两个整数 N,KN,K (1 \leq N, K \leq 10^51≤N,K≤10
5
),

以下 N 行每行包含两个整数 H_i,W_iH
i
?
,W
i
?
(1 \leq H_i, W_i \leq 10^51≤H
i
?
,W
i
?
≤10
5
),

输入保证每位小朋友至少能获得一块 1x1 的巧克力,

输出描述
输出切出的正方形巧克力最大可能的边长,

输入输出样例
示例
输入

2 10
6 5
5 6
copy
输出

2
copy
运行限制
最大运行时间:1s
最大运行存储器: 256M

本文由博客一文多发平台 OpenWrite 发布!

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *