二分算法的处理,不知道哪里有问题

这个是题目:

img


这个是我写的代码:
我用的是左闭右闭的方式
且是用向左取整

#include
#include 
int n;   //n为巧克力数量
int check(int d,int k,int *a,int *b)
{
    int i,num=0;
    for(i=0;i//总长/小长==数量 
        } 
    if(num>=k)         //说明够分 ,这个不太明白==,但是以后都这样写 
      return 1;
    else
      return 0;        //这是不够分的 
}
int main()
{
    int k,i=0,l,r,min,mid;//n为巧克力数量,k为朋友数量 
    scanf("%d%d",&n,&k);
    int a[k],b[k];//分别表示长和宽 
    r=1; 
    while(iscanf("%d%d",&a[i],&b[i]);
        i++; 
       min=a[i]>b[i]?b[i]:a[i];
        if(min>r)
          {
              r=min;
              }    
       }
    l=1;
    while(l<=r)
      {
          mid=(l+r)>>1 ;    //我一般都是使用向左取整
        if(check(mid,k,a,b)==1) 
          {
              l=mid+1;
          }
        else
           {
               r=mid-1;
           }
      }
    printf("%d",l);
    return 0;
    
}

但是我运行出来的答案是这样的:

img

我看了一下参考代码
是在最后打印那里不太一样,参考代码是这样的:printf("%d",l-1);
我一直理解不了为什么要减一呢?

因为你在check为真后,l=mid+1,所以最后找到的l指向的是第一个check为假的值,所以要回退一位

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7796256
  • 这篇博客也不错, 你可以看下如何用printf输出%d
  • 除此之外, 这篇博客: 【C】C语言printf,格式化字符串,缓冲区中的 如何输出 %d、\ 和双引号 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这是一片讲解printf的博客,我觉得还不错

    # include <stdio.h>
    int main(void)
    {
        printf("%%d\n"); // 两个百分号输出百分号
        printf("\\\n"); // 两个反斜杠表示反斜杠
        printf("\"\"\n"); // 使用转义字符的表示双引号
        return 0;
    }