CF985D Sand Fortress

思路:

很奇怪的结论题,不好想。参考了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 }
原文地址:https://www.cnblogs.com/wangyiming/p/9077167.html