您的位置:首页 > 教育 > 培训 > 猎头公司推荐_石家庄免费做网站_中国疫情最新数据_seo优化网站的注意事项

猎头公司推荐_石家庄免费做网站_中国疫情最新数据_seo优化网站的注意事项

2025/7/19 1:15:43 来源:https://blog.csdn.net/wuqingshun314159/article/details/147285241  浏览:    关键词:猎头公司推荐_石家庄免费做网站_中国疫情最新数据_seo优化网站的注意事项
猎头公司推荐_石家庄免费做网站_中国疫情最新数据_seo优化网站的注意事项

分巧克力

原题目链接

问题描述

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

小明一共有 N 块巧克力,其中第 i 块是 Hᵢ × Wᵢ 的长方形。为了公平起见,小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。

要求切出的巧克力满足以下条件:

  • 形状是正方形,边长是整数;
  • 大小相同。

例如:一块 6×5 的巧克力可以切出 62×2 的巧克力,或者 23×3 的巧克力。

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


输入描述

  • 第一行包含两个整数 NK1 ≤ N, K ≤ 10⁵)。
  • 接下来 N 行,每行包含两个整数 HᵢWᵢ1 ≤ Hᵢ, Wᵢ ≤ 10⁵),表示每块巧克力的尺寸。

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


输出描述

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


输入样例

2 10
6 5
5 6

输出样例

2

c++代码

#include<bits/stdc++.h>
#include<stdio.h>using namespace std;typedef long long ll;int main() {ll N, K, ans = 1, l = 1, r = 100000;scanf("%lld %lld", &N, &K);vector<vector<ll>> arr(N, vector<ll>(2));for (ll i = 0; i < N; i++) scanf("%lld %lld", &arr[i][0], &arr[i][1]);while(r >= l) {ll cnt = 0, mid = (l + r) / 2;for (ll j = 0; j < N; j++) cnt += (arr[j][0] / mid) * (arr[j][1] / mid);if (cnt >= K) ans = max(mid, ans), l = mid + 1;else r = mid - 1;}printf("%d", ans);return 0;
}//by wqs

思路解析

可以证明,如果边长为l的正方形不能分出K块,则变成为l + 1的正方形必定不能分出K块。
这是单调递增的,所以可以用二分枚举正方形的边长。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com