我怕侵权吃牢饭,题目就不贴上了。。。
本题思路类似第八届蓝桥杯分巧克力那道题,为了避免超时,采用二分查找答案。
思路:我们先确定一个防御力,然后遍历所有的位置,获得一共所需天数,如果满足题意,则向上缩小查找范围。
代码如下:
#include <stdio.h>
long long n,m,a[100005];
int ok(long long x)
{
long long sum=0,temp1=0,temp2=0;
for(int i=0;i<n;i++)
{
if(x%a[i])
{
temp1=x/a[i]+1;
}
else
{
temp1=x/a[i];
}
temp1-=temp2;
if(temp1>0)
{
temp2=temp1-1;
}
else
{
if(i!=n-1)
{
temp1=1;
temp2=0;
}
else
{
temp1=0;
temp2=0;
}
}
sum+=temp1+temp2;
if(sum>m) return 0;
}
return 1;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
long long min=1,max=1e18,mid;
while(min<max)
{
mid=(min+max)>>1;
if(ok(mid))
min=mid+1;
else
max=mid;
}
printf("%lld",min-1);
return 0;
}