分巧克力(刷题赛)

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 发布!

posted @ 2022-01-18 13:36  ethon-wang  阅读(193)  评论(0编辑  收藏  举报