思维详解:
* 拿到这个题的时候我第一个想起来的是短边效应,即最短边的长度决定巧克力的大小(虽然在这
个题里用处不大,但是我觉得还是很有意思的。)
* 然后后来就是想到二分,从题目给的数据范围里找出符合条件的那个数。题目给定数据范围是1~100000,那就从这个范围里找符合题目要求的数。构建好二分框架之后,再去具体实现check()内容。
* check内容其实更好弄明白,我现在拿到一个数,我直接检查我手上的巧克力按照这个数切到底
能不能够分给k个小朋友吃。就直接创一个计数器res,切一块记一次,如果够了说明就是这个数。
C++ 代码
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n,k;
int h[N],w[N];
bool check(int num){
int res=0;//记录个数
for(int i=0;i<n;i++){
res+=(h[i]/num)*(w[i]/num);
if(res>=k)return true;
}
return false;
}
int main(){
cin>>n>>k;
for(int i=0;i<n;i++)scanf("%d %d",&h[i],&w[i]);
int l=1,r=1e5;
while(l<r){
int mid = (l+r+1)/2;
if(check(mid)){
l=mid;
}
else{
r=mid-1;
}
}
cout<<l;
return 0;
}