UVA10883 题解

卡常大法好,1.83s 暴力模拟代码爆切蓝题!


题意就是有 \(n\) 个数,不断对相邻的两个数求平均值,输出最后剩下的那个数。

这不就纯模拟嘛,开个双重循环算就可以了,这还蓝啊?

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll N = 5e4 + 9;

ll t, n, num = 1;
double a[N]; 

int main() {

    cin >> t;
    while (t--) {
    	cin >> n;
    	for (ll i = 1; i <= n; i++) {
    		cin >> a[i];
		}
		for (ll i = n - 1; i >= 1; i--) {
			for (ll j = 1; j <= i; j++) {
				a[j] = (a[j] + a[j + 1]) / 2.0;
			}
		}
		printf("Case #%lld: %.3lf\n", num, a[1]);
		++num;
	}   
    return 0;
}

交上去,T 了。

啊?3 秒还能给我 T?(\(O(\dfrac{n^2}{2} \times N)\) 的复杂度 T 了好像确实挺正常的呃呃。

尝试卡常,打个 Ofast 和 cin 加速。

#include <bits/stdc++.h>

#pragma GCC optimize("Ofast")

using namespace std;

typedef long long ll;

const ll N = 5e4 + 9;

ll t, n, num = 1;
double a[N]; 

int main() {

    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> t;
    while (t--) {
    	cin >> n;
    	for (ll i = 1; i <= n; i++) {
    		cin >> a[i];
		}
		for (ll i = n - 1; i >= 1; i--) {
			for (ll j = 1; j <= i; j++) {
				a[j] = (a[j] + a[j + 1]) / 2.0;
			}
		}
		printf("Case #%lld: %.3lf\n", num, a[1]);
		++num;
	}
    return 0;
}

成功地用 1.83s 草过去了,遥遥领先。也许是暴力方法的最优解?

或许可以用快读快写,循环展开等方式卡到更少的用时,但我没试。

其实第一份代码是能用 2.94s 过的,这玩意纯看评测机心情。

posted @ 2023-11-26 14:56  FurippuWRY  阅读(13)  评论(0)    收藏  举报