1. 程式人生 > 其它 >演算法:整數二分(分巧克力)

演算法:整數二分(分巧克力)

技術標籤:演算法演算法二分法

問題描述

兒童節那天有 K 位小朋友到小明家做客。

小明拿出了珍藏的巧克力招待小朋友們。

小明一共有 N 塊巧克力,其中第 i 塊是 Hi×Wi 的方格組成的長方形。

為了公平起見,小明需要從這 N 塊巧克力中切出 K 塊巧克力分給小朋友們。

切出的巧克力需要滿足:

形狀是正方形,邊長是整數
大小相同
例如一塊 6×5 的巧克力可以切出 6 塊 2×2 的巧克力或者 2 塊 3×3 的巧克力。

當然小朋友們都希望得到的巧克力儘可能大,你能幫小明計算出最大的邊長是多少麼?

輸入格式

第一行包含兩個整數 N 和 K。

以下 N 行每行包含兩個整數 Hi 和 Wi。

輸入保證每位小朋友至少能獲得一塊 1×1 的巧克力。

輸出格式

輸出切出的正方形巧克力最大可能的邊長。

AC程式碼

#include<iostream>
using namespace std;
int n, m;
int siz[100010][2];
bool check(int mid)
{
    int ans = 0;
    for(int i = 0; i < n; ++i){
        int x = siz[i][0] / mid;
        int y = siz[i][1] / mid;
        ans +
= x * y; } return ans >= m; } int main() { cin >> n >> m; for(int i = 0; i < n; ++i){ scanf("%d %d",&siz[i][0],&siz[i][1]); } int l = 1, r = 1e5; for(int i = 0; i < 50; ++i){ int mid = (l + r) / 2; if(check(mid)){
l = mid; }else{ r = mid; } } cout << l << endl; return 0; }

題目連結