每日一刷
题目如下:
抱着侥幸心理觉得后台不会有100000*100000的数据,然后直接暴力枚举,代码如下:
int main()
{
int n,k,a[N],b[N],ans;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i]>>b[i];
}
int len=100000;
for(;len>0;len--)
{
int sum=0;
for(int i=0;i<n;i++)
{
sum+=(a[i]/len)*(b[i]/len);
}
if(sum>=k)
{
cout<<len<<endl;
break;;
}
}
return 0;
}
实际上它真的有,提交结果如下:
有两组TLE了,然后试着优化,打算把len以两条边的最小值为初值自减判断,然后发现我不会写一点也不难过 再然后去看了蓝桥的官方题解视频,优化方法是采取二分法,然后又重新整理了一下思路,代码如下:
int main()
{
int n,k,a[N],b[N],ans;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i]>>b[i];
}
int r=100000;
int l=1;
while(r>=l)
{
int len=(r+l)/2;
int sum=0;
for(int i=0;i<n;i++)
{
sum+=(a[i]/len)*(b[i]/len);
}
if(sum>=k)
{
l=len+1;//接着判断[len+1,r]
ans=len;
}
else
r=len-1;//判断[l,len-1]
}
cout<<ans<<endl;
return 0;
}
其实很多这种枚举类型的题都可以上述两种方法优化,毕竟暴力枚举是解题最好用的方法之一(hhhh