題解 CF760B Frodo and pillows
阿新 • • 發佈:2021-06-25
分析
就是一道二分答案的題,列舉 \(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; }