11 条题解
-
-2
赛时用实时更新最大值并判断的方法通过了此题,现在证明一下这个算法的时间复杂度。
首先,我们可以将 都表示为 的形式, 显然是 , 通过推导可得 。随着 的增加, 也随之增加,那么 也会变得越来越小。对于 在 中的 ,我们就有 ,实际上从 开始就已经满足严格单调递减了,所以这个算法最多会执行 次,时间复杂度显然是 。
参考代码如下:
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native") #define _CRT_SECURE_NO_WARNINGS #include <bits/stdc++.h> #define ll long long #define writes(x) write(x), putchar(' ') #define writeln(x) write(x), putchar('\n'); static char buf[100000], * pa(buf), * pb(buf); int st[114], top; #define gc pa == pb && (pb = (pa = buf) + fread(buf, 1, 100000, stdin), pa == pb) ? EOF : *pa++ using namespace std; mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()); void debug(auto st, auto ed, bool endline) { for (auto it = st; it != ed; ++it) { cout << *it << " "; } if (endline) cout << '\n'; } template <typename T> void read(T& x) { T t = 0, sgn = 1; char ch = gc; while (!isdigit(ch)) { if (ch == '-') sgn = -sgn; ch = gc; } while (isdigit(ch)) { t = (t << 3) + (t << 1) + (ch ^ 48); ch = gc; } x = sgn * t; } template <typename T, typename ...Args> void read(T& tmp, Args &...tmps) { read(tmp); read(tmps...); } template <typename T> void write(T x) { if (x < 0) putchar('-'), x = -x; top = 0; while (x) { st[++top] = x % 10; x /= 10; } do { putchar(st[top--] + '0'); } while (top > 0); } template <typename T, typename ...Args> void write(T& tmp, Args &...tmps) { writes(tmp); writes(tmps...); } template <typename T> T rand(T l, T r) { return rnd() % (r - l + 1) + l; } int main() { cin.tie(0)->sync_with_stdio(0); cout.tie(0)->sync_with_stdio(0); int t; cin >> t; while (t--) { ll n, k; cin >> n >> k; double ans = 0.0; double mxn = 0.0; for (int i = 1; i <= n; i++) { ans = (1.0 * k + 1.0 * ans / i); if (ans > mxn) { mxn = ans; } else break; } cout << fixed << setprecision(1) << mxn << '\n'; } }
信息
- ID
- 13
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 2
- 标签
- 递交数
- 1259
- 已通过
- 336
- 上传者