这个二分的次数竟然不是logn,求助!
查看原帖
这个二分的次数竟然不是logn,求助!
586915
zdz10124楼主2023/3/11 21:25
#include<iostream>
#include<stdio.h>
using namespace std;
int mx,last,s,n,k;
int const N=100000+5;
int step=0;
int b[N],c[N];
int l,r;
int main()
{
	cin>>s>>n>>k;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&b[i]);
		c[i-1]=b[i]-b[i-1];
		mx=max(mx,c[i-1]);
	 } 
	
	l=0;
	r=mx;
	
	while(1)
	{
		//step++;
		//if(step>100)break;
		int ans=0;
		int m=(l+r)/2;
		for(int i=1;i<=n-1;i++)
		{
			ans+=c[i]/m;
			if(c[i]%m==0)ans--;
		}
		
		if(ans>k)
		{
			l=m+1;
		}
		if(ans==k)	
		{
			last=m;
			if(r-l+1<2)break;
			r=m;
				
		}
		if(ans<k)
		{
			r=m;
		}
	}
	cout<<last;
	return 0;
	}

经过自己测试,(通过代码中那个注释掉的step)

99999 2 1二分了18次

100000000 2 1二分了27次,非常合理且完美

但是经过测试,对于洛谷给的样例我的二分至少运行了一百次。前五个样例正确,后五个全部超时。 自己检查没有发现问题,受不了,求助洛友TAT

2023/3/11 21:25
加载中...