11 条题解

  • -2
    @ 2024-7-15 15:33:07

    赛时用实时更新最大值并判断的方法通过了此题,现在证明一下这个算法的时间复杂度。

    首先,我们可以将 T1TnT_1 \sim T_n 都表示为 (1+pq)k(1 + \frac{p}{q})k 的形式,T1T_1 显然是 kkT2T_2 通过推导可得 (1+12)k=32k(1 + \frac{1}{2})k = \frac{3}{2}k。随着 ii 的增加,qq 也随之增加,那么 TiT_i 也会变得越来越小。对于 ii2n2 \sim n 中的 TiT_i,我们就有 T2T3T4T5TnT_2 \ge T_3 \ge T_4 \ge T_5 \ge \ldots \ge T_n,实际上从 T3T_3 开始就已经满足严格单调递减了,所以这个算法最多会执行 33 次,时间复杂度显然是 O(1)O(1)

    参考代码如下:

    // #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
    上传者