分巧克力 (第八屆藍橋杯省賽C++A/B組)

題意描述

兒童節那天有 K 位小朋友到小明家做客。
小明拿出了珍藏的巧克力招待小朋友們。
小明一共有 N 塊巧克力,其中第 i 塊是 Hi×Wi 的方格組成的長方形。
爲了公平起見,小明需要從這 N 塊巧克力中切出 K 塊巧克力分給小朋友們。
切出的巧克力需要滿足:
形狀是正方形,邊長是整數
大小相同
例如一塊 6×5 的巧克力可以切出 6 塊 2×2 的巧克力或者 2 塊 3×3 的巧克力。
當然小朋友們都希望得到的巧克力儘可能大,你能幫小明計算出最大的邊長是多少麼?

輸入格式
第一行包含兩個整數 N 和 K。
以下 N 行每行包含兩個整數 Hi 和 Wi。
輸入保證每位小朋友至少能獲得一塊 1×1 的巧克力。

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

數據範圍
1≤N,K≤105,
1≤Hi,Wi≤105

輸入樣例:
2 10
6 5
5 6
輸出樣例:
2

思路

同樣是一道二分的題,能夠切成的蛋糕的數量等於寬度/邊長*高度/邊長,我們還可以發現,寬度和高度越大,數量就越小,這個時候我們就可以用二分來查找能夠分的最大邊長

AC代碼

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int h[N],w[N];
int n,k;
bool check(int mid){
    int res=0;
    for(int i=0;i<n;i++){
    	//尋找每塊蛋糕能夠以mid爲邊長分爲多少塊
        res+=(h[i]/mid)*(w[i]/mid);//注意加小括號
        if(res>=k) return true;
    }
    return false;
}
int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++) cin>>h[i]>>w[i];
    int l=0,r=1e5;
    while(l<r){
        int mid=l+r+1>>1;
        if(check(mid)) l=mid;
        else r=mid-1;
    }
    cout<<l<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章