lsmCC 发表于 2023-11-13 19:08:50

还有一个地方不懂

#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-(!cnt)<=m; //以res=1开始的,如果没有
   

}
void min()
{
    ll l=0,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();
   
}
为什么return res-(!cnt)<=m;为什么要减去取反的cnt呢

isdkz 发表于 2023-11-13 19:09:00

这段代码是在解决一个放置物品的问题,具体来说是将n个物品放入m个容量为k的容器中,要求使得所需的容器数量最少。在这段代码中,return res-(!cnt)<=m; 这行代码的作用是判断当前的容器数量res是否小于等于m。

其中,res表示当前已经使用的容器数量,而cnt表示当前容器中已经放置的物品的总体积。在这行代码中,!cnt表示如果cnt为0则取反为1,否则为0。这样做的目的是在cnt为0时,实际上是在判断res-1是否小于等于m,即表示当前容器数量减去一个空容器后是否小于等于m。

这是因为在放置物品时,如果当前容器已经放不下新的物品,需要另外启动一个新的容器,所以需要将res减1来判断是否小于等于m。

Mike_python小 发表于 2023-11-13 19:11:20

在这段代码中,return res-(!cnt)<=m; 这一行是用来判断某个条件是否满足,并返回布尔值。

解释:
- res-(!cnt) 表示如果 cnt 为 0,则结果为 res-1,否则结果为 res。
- <=m 表示判断前面的值是否小于等于 m。

因此,整体来看,return res-(!cnt)<=m; 的意思是判断 res-1 是否小于等于 m,如果是则返回 true,否则返回 false。

希望以上解答能够帮到你。如果还有其他问题,欢迎继续提问。
页: [1]
查看完整版本: 还有一个地方不懂