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 过的,这玩意纯看评测机心情。

浙公网安备 33010602011771号