题目链接:http://codeforces.com/problemset/problem/760/B
题意:n个床位,m个枕头,第k个位置最多有多少个枕头,其中相邻之间的差<=1;
第k个位置最大,那么两边只能是-1,-2,-3下走。
二分查找。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 long long n,m,k; 6 7 int Slove(long long mid) { 8 long long sum = 0; 9 if(k>=mid) 10 { 11 sum+=(1+mid)*mid/2; 12 sum+=(k-mid); 13 } 14 if(k<mid) { 15 sum+=((mid-k+1)+mid)*k/2; 16 } 17 18 if(k+(mid-1)<=n) { 19 sum+=(1+mid)*mid/2; 20 sum+=n-(k+(mid-1)); 21 } 22 23 if(k+(mid-1)>n) { 24 sum+=(mid+(mid-n+k))*(n-k+1)/2; 25 } 26 if(sum-mid<=m) return 1; 27 else return 0; 28 } 29 30 int main() 31 { 32 //scanf("%d%d%d",&n,&m,&k); 33 cin>>n>>m>>k; 34 long long ans = 0; 35 long long l = 1; 36 long long r = m; 37 while(l<=r) { 38 39 long long mid = (l+r)/2; 40 if(Slove(mid)==1) { 41 ans = mid; 42 l = mid+1; 43 } 44 else r = mid-1; 45 } 46 cout<<ans<<endl; 47 return 0; 48 }