鱼C论坛

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

还有一个地方不懂

[复制链接]
发表于 2023-11-13 19:08:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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-(!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呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

希望以上解答能够帮到你。如果还有其他问题,欢迎继续提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 19:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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