关于二分答案
查看原帖
关于二分答案
241102
ThisIsAName楼主2020/10/4 23:56

感谢你能点进来。

这个蒟蒻现在在怀疑自己的二分板子..所以如果你能帮助我,那么感激不尽。

#include<cstdio>
#include<iostream>
#define rg register
#define il inline
#define MAXN 100010
using namespace std;

template <typename T> il void init(T &x)
{
	char c;
	while((c=getchar())<'0' || c>'9');
	x = c^48;
	while((c=getchar())>='0' && c<='9')	x = (x<<1) + (x<<3) + (c^48);
}

template <typename T> void outit(T x)
{
	if(x > 9)	outit(x/10);
	putchar(x%10^48);
}
//------------------------快读快写----------------------------
int n, m, a[MAXN];

il bool check(int x)
{
	//int cur=0, num=1;//WA
    int cur=0, num=0;//AC
    /*此处对这道题来说我不是很明白num初值为什么取0,我觉得这样会少计算一块(比如x远远大于cur时num恒为0而实际上num==1)*/
	for(rg int i=1 ; i<=n ; ++i)
	{
		cur += a[i];
		if(cur>x)
		{
			++num;
			cur = a[i];
		}
	}
	return num >= m;
}
/*
il int binary(int l, int r)	//WA
{
	while(l != r)
	{
		int mid = (l+r+1)>>1;
		if(check(mid))	l=mid;
		else r=mid-1;
	}
	return l;
}*/
/*二分WAWAWA*/
il int binary(int l, int r)//AC
{
	while(l <= r)
	{
		int mid = (l+r)>>1;
		if(check(mid))	l=mid+1;
		else r=mid-1;
	}
	return l;
}

int main()
{
	
	init(n), init(m);
	int l=0, r=0;
	for(rg int i=1 ; i<=n ; ++i)
	{
		init(a[i]);
		if(a[i] > l)	l = a[i];
		r += a[i];
	}
	outit(binary(l, r));
	
	return 0;
}

完了二分都不会写了

谢谢你

2020/10/4 23:56
加载中...