思路:
很奇怪的结论题,不好想。参考了http://codeforces.com/blog/entry/59623
实现:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll INF = 0x7f7f7f7f; 5 ll n, H; 6 bool check(ll m) 7 { 8 ll tmp = min(m, H); 9 return m * m - tmp * (tmp - 1) / 2 <= n; 10 } 11 ll solve(ll n, ll H) 12 { 13 ll l = 1, r = INF, ans = -1; 14 while (l <= r) 15 { 16 ll m = l + r >> 1; 17 if (check(m)) 18 { 19 ans = m; 20 l = m + 1; 21 } 22 else r = m - 1; 23 } 24 return ans; 25 } 26 int main() 27 { 28 while (cin >> n >> H) 29 { 30 ll k = solve(n, H); 31 ll t = min(k, H); 32 ll ans = 2 * k - 1 - t; 33 ll rem = n - (k * k - t * (t - 1) / 2); 34 ans += (rem + k - 1) / k; 35 cout << ans + 1 << endl; 36 } 37 return 0; 38 }