1. 程式人生 > 其它 >題解 CF760B Frodo and pillows

題解 CF760B Frodo and pillows

Link

分析

就是一道二分答案的題,列舉 \(Frodo\) 能擁有的枕頭數,在確定該數後,運用貪心思想,其他人分得的枕頭數,應該以他為中心,向四周遞減,才能儘可能地少用枕頭來滿足這個要求,根據兩個要點來計算,相鄰之差不能大於等於二,因此向左和向右皆為一個公差為1的等差數列,第二個要點就是每人至少要有一個枕頭,特判左右數列長度和首項關係即可。

程式碼

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,k,ans;
inline void read(int &res){
	res=0;
	char c=getchar();
	while(c<'0'||c>'9')c=getchar();
	while(c>='0'&&c<='9')res=(res<<1)+(res<<3)+c-48,c=getchar();
}
bool check(int x){
	int sum=x,len;//提前加入Frodo自身的枕頭數,避免重複 
	len=k-1;//數列長度 
	if(len<x)sum+=(x-len+x-1)*(len)/2;
	else sum+=x*(x-1)/2+len-x+1;//首項加末項除以二 
	len=n-k;
	if(len<x)sum+=(x-len+x-1)*(len)/2;
	else sum+=x*(x-1)/2+len-x+1;
	return sum<=m;//最少需要的枕頭數是否能夠得到 
}
signed main()
{
	read(n);read(m);read(k);
	int l=1,r=m;
	while(l<=r){//二分 
		int mid=(l+r)>>1;
		if(check(mid))ans=mid,l=mid+1;
		else r=mid-1;
	}
	cout<<ans<<endl;
	return 0;
}