90分测试点6没过,求调
查看原帖
90分测试点6没过,求调
938794
lty_ylzsx楼主2023/5/27 18:56
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll D,d[50010],n,m,inter[50010],st,ed,mid;
ll sor[50010],jis;
ll ans;



int main()
{
	scanf("%lld%lld%lld",&D,&n,&m);
	ans=D; 
	if(n==0)
	{
		printf("%lld",ans);
		return 0;	
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&d[i]);
		inter[i]=d[i]-d[i-1];
		sor[i]=inter[i];
	}
	sor[n+1]=inter[n+1]=D-d[n];
	sort(sor+1,sor+n+1);
	st=sor[1];ed=sor[n];
//	cout<<st<<" "<<ed;
	int jump,j;
	while(1)
	{
		jis=0;
		mid=(st+ed)/2;//cout<<"mid="<<mid<<endl;
		//cout<<"ans="<<ans<<endl<<endl;
		if(mid==ans)  break;
		for(int i=1;i<=n+1;i++)
		{
			jump=inter[i];j=i;
//			cout<<j<<endl<<endl;
			while(mid>jump&&j<=n){
				jis++;
				j++;
				jump+=inter[j];
//				cout<<"j="<<j<<endl;
			}
			i=j;
		}
//		cout<<jis;
		if(jis>m)//不合法
		{
			ed=mid;
			//cout<<"start="<<st<<" end="<<ed<<endl;
		}
			
		else{
			ans=mid;
			//cout<<"start="<<st<<" end="<<ed<<endl;
			//cout<<"st+ed /2="<<(st+ed)/2<<endl;
			st=mid;
		}
	}
	printf("%lld",ans);
	
}
2023/5/27 18:56
加载中...