鱼C论坛

 找回密码
 立即注册
查看: 1434|回复: 2

[已解决]atcoder 319的d题,其中else里面的代码不理解

[复制链接]
发表于 2023-11-13 17:56:23 | 显示全部楼层 |阅读模式
4鱼币
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. int m,n;
  5. const int N=2e5+10;
  6. int a[N];
  7. void putin()
  8. {
  9.     cin>>n>>m;
  10.     for(int i=0;i<n;i++)
  11.     {
  12.         cin>>a[i];
  13.     }
  14. }
  15. bool check(ll k)
  16. {
  17.     ll res =1,cnt=0; //res表示行数
  18.     for(int i=0;i<n;i++)
  19.     {
  20.         if(a[i]>k)return 0; // 9 5 2 8  10 16 18
  21.         else if(a[i]+cnt+1<=k)cnt+=a[i]+1;
  22.         else if(cnt+a[i]<=k) res++,cnt=0; //表示到了26没有空格
  23.         else res++,cnt=a[i]+1;//特判
  24.         

  25.     }
  26.     return res<=m;
  27.    

  28. }
  29. void min()
  30. {
  31.     ll l=1,r=1e15;
  32.     while(l<r)
  33.     {
  34.         ll mid=l+r>>1;
  35.         if(check(mid))r=mid;
  36.         else l=mid+1;
  37.     }
  38.     cout<<r<<endl;

  39. }
  40. int main()
  41. {
  42.     ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  43.     putin();
  44.     min();
  45.    
  46. }
复制代码

最佳答案
2023-11-13 17:56:24
对于这个问题,我们来逐行解释一下else语句里的代码:
  1. else if(a[i]+cnt+1 <= k)
  2.     cnt += a[i] + 1;
复制代码

这行代码的作用是在当前元素a[i]的值加上cnt(之前元素累计的值)再加1,判断是否小于等于k。如果满足条件,则将cnt增加到新的值,表示当前已经占用了这个位置,并继续处理下一个元素。
  1. else if(cnt + a[i] <= k)
  2.     res++, cnt = 0;
复制代码

这行代码的作用是在当前元素a[i]的值加上cnt,判断是否小于等于k。如果满足条件,则表示当前元素和之前元素的累计值加起来不超过k,即当前行还有剩余空间。此时需要增加行数res,并将cnt重置为0,表示新的一行开始。
  1. else
  2.     res++, cnt = a[i] + 1;
复制代码

这行代码是else的最后一种情况,即当前元素无法放入当前行,也无法另起一行放入。所以需要增加行数res,并将cnt设置为当前元素的值加1,表示开启新的一行。

希望以上解释能够帮助你理解这段代码。如果还有其他问题,请随时提问。

最佳答案

查看完整内容

对于这个问题,我们来逐行解释一下else语句里的代码: 这行代码的作用是在当前元素a的值加上cnt(之前元素累计的值)再加1,判断是否小于等于k。如果满足条件,则将cnt增加到新的值,表示当前已经占用了这个位置,并继续处理下一个元素。 这行代码的作用是在当前元素a的值加上cnt,判断是否小于等于k。如果满足条件,则表示当前元素和之前元素的累计值加起来不超过k,即当前行还有剩余空间。此时需要增加行数res,并将cnt重 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-13 17:56:24 | 显示全部楼层    本楼为最佳答案   
对于这个问题,我们来逐行解释一下else语句里的代码:
  1. else if(a[i]+cnt+1 <= k)
  2.     cnt += a[i] + 1;
复制代码

这行代码的作用是在当前元素a[i]的值加上cnt(之前元素累计的值)再加1,判断是否小于等于k。如果满足条件,则将cnt增加到新的值,表示当前已经占用了这个位置,并继续处理下一个元素。
  1. else if(cnt + a[i] <= k)
  2.     res++, cnt = 0;
复制代码

这行代码的作用是在当前元素a[i]的值加上cnt,判断是否小于等于k。如果满足条件,则表示当前元素和之前元素的累计值加起来不超过k,即当前行还有剩余空间。此时需要增加行数res,并将cnt重置为0,表示新的一行开始。
  1. else
  2.     res++, cnt = a[i] + 1;
复制代码

这行代码是else的最后一种情况,即当前元素无法放入当前行,也无法另起一行放入。所以需要增加行数res,并将cnt设置为当前元素的值加1,表示开启新的一行。

希望以上解释能够帮助你理解这段代码。如果还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-13 17:56:35 | 显示全部楼层
这段代码是一个解题程序,用于解决AtCoder 319题中的D题。在这段代码中,主要有一个名为 check 的函数,用于检查给定的一个数 k 是否满足特定的条件。在 check 函数中,有一个 else 分支里的代码可能比较难理解。让我来解释一下。

在 else 分支中,有以下代码:
  1. else if(cnt+a[ i]<=k) res++,cnt=0; //表示到了26没有空格
复制代码


这段代码的作用是当 cnt+a[ i] 小于或等于 k 时,增加 res 的值并将 cnt 重置为0。这里的 cnt 表示当前行的字符总数, a[ i] 表示当前要放入的字符数,而 k 表示每行的最大字符数限制。

这段代码的作用是在当前字符数加上 a[ i] 后不超过每行的最大字符数限制 k 时,增加 res 表示需要的行数,并重置 cnt 为0,表示当前行已经填满字符。

这段代码的作用是确保每行的字符总数不超过给定的限制 k ,如果超过了则增加行数,并将当前行的字符总数重置为0。

希望这样的解释能够帮助你更好地理解这段代码。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-21 14:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表