还有一个地方不懂
#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呢 这段代码是在解决一个放置物品的问题,具体来说是将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。 在这段代码中,return res-(!cnt)<=m; 这一行是用来判断某个条件是否满足,并返回布尔值。
解释:
- res-(!cnt) 表示如果 cnt 为 0,则结果为 res-1,否则结果为 res。
- <=m 表示判断前面的值是否小于等于 m。
因此,整体来看,return res-(!cnt)<=m; 的意思是判断 res-1 是否小于等于 m,如果是则返回 true,否则返回 false。
希望以上解答能够帮到你。如果还有其他问题,欢迎继续提问。
页:
[1]