lsmCC 发表于 2023-11-13 17:56:23

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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int m,n;
const int N=2e5+10;
int a;
void putin()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
      cin>>a;
    }
}
bool check(ll k)
{
    ll res =1,cnt=0; //res表示行数
    for(int i=0;i<n;i++)
    {
      if(a>k)return 0; // 9 5 2 810 16 18
      else if(a+cnt+1<=k)cnt+=a+1;
      else if(cnt+a<=k) res++,cnt=0; //表示到了26没有空格
      else res++,cnt=a+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();
   
}

Mike_python小 发表于 2023-11-13 17:56:24

对于这个问题,我们来逐行解释一下else语句里的代码:


else if(a+cnt+1 <= k)
    cnt += a + 1;


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


else if(cnt + a <= k)
    res++, cnt = 0;


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


else
    res++, cnt = a + 1;


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

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

isdkz 发表于 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。

希望这样的解释能够帮助你更好地理解这段代码。
页: [1]
查看完整版本: atcoder 319的d题,其中else里面的代码不理解