分巧克力
发布日期:2022-02-08 04:20:48 浏览次数:2 分类:技术文章

本文共 1334 字,大约阅读时间需要 4 分钟。

一些常用知识:

(1)1s时限一般可以满足10^8次的运算。

(2)1个int要占用4B,1个char要占用1B,1个long long 或 double 要占用8B

标题: 分巧克力

儿童节那天有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的巧克力。   

输出

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

#include 
#include
#include
using namespace std;const int MAX_N = 1e5 + 5;const double EPS = 1e-8; // 在浮点数运算中,会出现误差,EPS用于修正这些误差long long h[MAX_N], w[MAX_N];int n, k;bool judge(int x) { long long sum = 0; for (int i = 0; i < n; i++) { sum += (h[i] / x) * (w[i] / x); } return sum >= k;}// 以下这段代码被称为整数二分int erfen(int L, int R) { int ans = L; while (L <= R) { int M = (L + R) / 2; if (judge(M)) { ans = M; L = M + 1; } else R = M - 1; } return ans;}int main() { int max_R = 0; long long area = 0; scanf("%d%d", &n, &k); for (int i = 0; i < n; i++) { scanf("%lld%lld", &h[i], &w[i]); area += h[i] * w[i]; max_R = max(max_R, (int)min(h[i], w[i])); } int ans = erfen(2, min(int(sqrt(area / k + EPS) + EPS), max_R)); printf("%d\n", ans); return 0;}

转载地址:https://blog.csdn.net/weixin_38960774/article/details/79413301 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:BFS
下一篇:蓝桥杯-正则表达式

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月11日 01时16分31秒