链接
题意:给你几块大的巧克力的尺寸,和需要分享的人,求每人最多可以分得多大的巧克力(每人分得的大小必须一致)
分析:一块巧克力能分为(a/c)*(b/c)小块,开始想的是c从1开始遍历,但是部分超时,解决方法见代码注释;
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long sum;
int inf=0x3f3f3f3f;
struct node
{
int x,y;
}e[N];
int main()
{
int n,k,b,minn;
scanf("%d%d",&n,&k);
minn=-inf;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&e[i].x,&e[i].y);
minn=max(minn,e[i].x);
minn=max(minn,e[i].y);
}
//b=1;
int nn=10000;
b=minn;//minn为巧克力中长或宽最大的,从minn开始起初起始肯定不够分 所以递归减小
while(nn--)
{
sum=0;
for(int i=1;i<=n;i++)
{
sum+=(e[i].x/b)*(e[i].y/b);
}
if(sum>=k)
{
printf("%d\n",b);
break;
}
b--;
}
/* 如果N=1e5块巧克力分给2个人,复杂度为N=o(N*(N-2)) 会超时
while(nn--)
{
sum=0;
for(int i=1;i<=n;i++)
{
sum+=(e[i].x/b)*(e[i].y/b);
}
if(sum<k)
{
printf("%d\n",b-1);
break;
}
b++;
}*/
}