普及2 训练2 没看懂什么二分性

求大佬帮帮忙,谢谢

3 个赞

第3题也不会

3 个赞

题面呢?

4 个赞

忘了你们看不到

2 个赞



image

3 个赞

我思路会,是在删除最多的0,删除最小的1,做到协调

3 个赞

错误代码?

4 个赞

第2题有思路了,但二分的check函数不会

3 个赞
//第2题
#include<bits/stdc++.h>
using namespace std;
long long n,k,a[100010];
int check(int mid){
	//不会 
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	long long l=0,r=1e15,mid;
	while(l+1<r){
		mid=(l+r)/2;
		if(check(mid))l=mid+1;
		else r=mid-1; 
	}cout<<l;
	return 0;
} 
3 个赞
bool check(int mid) {
	int cnt = 0, res = 0;
	for (int i = 1; i <= n; i++) {
		if (a[i] + res < mid) {
			cnt += (mid - a[i] - res + i - 1) / i;     //操作次数
			res += (mid - a[i] - res + i - 1) / i * i; //下一个数加的值
		}
	}
	return cnt <= k; //判断操作次数是否 <= k
}

求解决方案

4 个赞

第3题也讲讲吧我思路和check都不会 :joy: 我先给个赞

3 个赞

可我提交试一下WA0

#include<bits/stdc++.h>
using namespace std;
long long n,k,a[100010];
int check(long long mid){
	long long cnt=0,res=0;
	for(int i=1;i<=n;i++){
		if(a[i]+res<mid){
			cnt+=(mid-a[i]-res+i-1)/i;
			res+=(mid-a[i]-res+i-1)/i*i;
		}
	}return cnt<=k;
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	long long l=0,r=1e15,mid;
	while(l+1<r){
		mid=(l+r)/2;
		if(check(mid))l=mid+1;
		else r=mid-1; 
	}cout<<l;
	return 0;
} 
3 个赞

不开long long见祖宗 我开了long long 53分

3 个赞

好像二分模板写混了

3 个赞

:rofl: :joy: :cry: :cry:

3 个赞

第二个A了吗?

4 个赞

A了呀

3 个赞

没事了

3 个赞

???

3 个赞

第3题怎么二分

3 个赞