本题思路很清晰:我们只需将所有的边长从大到小都进行枚举,并且计算对应能够供给小朋友的巧克力块数,直到能够满足K的需求!!!!!!!!!!!!!!!!!!!!!!!!!!!
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i,j,n,k,num[100005][2];
scanf("%d%d",&n,&k);
for(i=0;i<n;i++)
{
for(j=0;j<2;j++)
{
scanf("%d",&num[i][j]);
}
}
int len=100000;
while(len>=1)
{
int sum=0;
for(i=0;i<n;i++)
{
sum+=(num[i][0]/len)*(num[i][1]/len);
}
if(sum>=k)
break;
len--;
}
printf("%d",len);
return 0;
这是我写的未经过优化的代码,很明显,提交后超出时间限制,本题数据规模最大可达10的10次方,像这类有大数据的题目,我们通常都必须优化。
这里给出一种优化方法:二分法!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#include<stdio.h>
int main()
{
int i,j,n,k,num[100005][2],l,ans,r,mid;
scanf("%d%d",&n,&k);
for(i=0;i<n;i++)
{
for(j=0;j<2;j++)
{
scanf("%d",&num[i][j]);
}
}
r=100001;
l=1;
ans=0;
while(l<=r)
{
mid=(r+l)/2 ;
int sum=0;
for(i=0;i<n;i++)
{
sum+=(num[i][0]/mid)*(num[i][1]/mid);
}
if(sum>=k)
{
l=mid+1;
ans=mid;
}
else
{
r=mid-1;
}
}
printf("%d",ans);
return 0;
}