这题是一个二分,只要二分枚举最大边长即可。
二分模板是这样(yls模板):
while(L<R){
int mid=(L+R+1)>>1;
if(check(mid)) L=mid;
else R=mid-1;
}
然后写check函数,大概就是查出每个蛋糕可以切成多少份mid*mid的块然后求和和人数比较
其中a*b的蛋糕能切成(a/mid)乘以(b/mid)个mid乘以mid的正方形蛋糕
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,k,a[N],b[N],L=1,R=10000;
bool check(int x){
int now=0;
for(int i=1;i<=n;i++){
now+=(a[i]/x)*(b[i]/x);
}
if(now>=k) return true;
return false;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i],&b[i]);
while(L<R){
int mid=(L+R+1)>>1;
if(check(mid)) L=mid;
else R=mid-1;
}
printf("%d",L);
return 0;
}
玩AC SABER输了的一题(手速!)然后事后AC