鱼C论坛

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

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

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

    }
    return res<=m;
    

}
void min()
{
    ll l=1,r=1e15;
    while(l<r)
    {
        ll mid=l+r>>1;
        if(check(mid))r=mid;
        else l=mid+1;
    }
    cout<<r<<endl;

}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    putin();
    min();
    
}
最佳答案
2023-11-13 17:56:24
对于这个问题,我们来逐行解释一下else语句里的代码:
else if(a[i]+cnt+1 <= k)    cnt += a[i] + 1;
这行代码的作用是在当前元素a[i]的值加上cnt(之前元素累计的值)再加1,判断是否小于等于k。如果满足条件,则将cnt增加到新的值,表示当前已经占用了这个位置,并继续处理下一个元素。
else if(cnt + a[i] <= k)    res++, cnt = 0;
这行代码的作用是在当前元素a[i]的值加上cnt,判断是否小于等于k。如果满足条件,则表示当前元素和之前元素的累计值加起来不超过k,即当前行还有剩余空间。此时需要增加行数res,并将cnt重置为0,表示新的一行开始。
else    res++, cnt = a[i] + 1;
这行代码是else的最后一种情况,即当前元素无法放入当前行,也无法另起一行放入。所以需要增加行数res,并将cnt设置为当前元素的值加1,表示开启新的一行。

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

最佳答案

查看完整内容

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

使用道具 举报

发表于 2023-11-13 17:56:24 | 显示全部楼层    本楼为最佳答案   
对于这个问题,我们来逐行解释一下else语句里的代码:
else if(a[i]+cnt+1 <= k)    cnt += a[i] + 1;
这行代码的作用是在当前元素a[i]的值加上cnt(之前元素累计的值)再加1,判断是否小于等于k。如果满足条件,则将cnt增加到新的值,表示当前已经占用了这个位置,并继续处理下一个元素。
else if(cnt + a[i] <= k)    res++, cnt = 0;
这行代码的作用是在当前元素a[i]的值加上cnt,判断是否小于等于k。如果满足条件,则表示当前元素和之前元素的累计值加起来不超过k,即当前行还有剩余空间。此时需要增加行数res,并将cnt重置为0,表示新的一行开始。
else    res++, cnt = a[i] + 1;
这行代码是else的最后一种情况,即当前元素无法放入当前行,也无法另起一行放入。所以需要增加行数res,并将cnt设置为当前元素的值加1,表示开启新的一行。

希望以上解释能够帮助你理解这段代码。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

在 else 分支中,有以下代码:
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。

希望这样的解释能够帮助你更好地理解这段代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 18:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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