CF1159B 题解(枚举优化)
Contents
题目链接
https://codeforces.com/contest/1159/problem/B
题意
给定 $n$ 个非负整数 $a_1,a_2,…,a_n$,求 $\frac{\min(a_i, a_j)}{|i-j|}$ ?其中 $i, j \in [1,n], i \neq j$
题解
对于这类的枚举问题,一般套路都是 “固定一个数”,这里很明显是固定一下 $\min(a_i, a_j)$。
所以只要从 $a_1$ 遍历到 $a_n$,把当前遍历到的值作为最小值,然后不管最左侧或者最右侧元素是否小于它,直接最大化分母就可以了。
为什么不会漏解?因为 每一个 $a_i$ 都当了一次分子!
代码
const int maxn = 3e5+5;
int n, arr[maxn];
int ans = 1e9;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> arr[i];
for (int i = 1; i <= n; i++) {
int d = max(i-1, n-i);
ans = min(ans, arr[i] / d);
}
cout << ans << endl;
}