[UOJ #21]【UR #1】缩进优化
题目大意:给你$a_i$,表示第$i$行有$a_i$个空格,你需要确定一个$TAB$宽度,使得剩下的字符最少
题解:做前缀和,发现枚举$TAB$暴力求解是$O(n\log_2n)$的,完全可以过
卡点:无
C++ Code:
#include <cstdio>
#include <algorithm>
#define maxn 1000010
const long long inf = 0x3f3f3f3f3f3f3f3f;
int n, M;
long long __s[maxn], sum, ans, *s = __s + 1;
int main() {
scanf("%d", &n);
for (int i = 1, x; i <= n; i++) {
scanf("%d", &x);
s[x]++;
sum += x;
M = std::max(x, M);
} ans = sum;
for (int i = 1; i <= M; i++) s[i] += s[i - 1];
for (int i = 2; i <= M; i++) {
long long res = 0, j;
for (j = i; j <= M; j += i) {
res += (s[j - 1] - s[j - i - 1]) * (j / i - 1);
}
res += (s[M] - s[j - i - 1]) * (M / i);
ans = std::min(ans, sum - res * (i - 1));
}
printf("%lld\n", ans);
return 0;
}

浙公网安备 33010602011771号