[UOJ #21]【UR #1】缩进优化

题目大意:给你$a_i$,表示第$i$行有$a_i$个空格,你需要确定一个$TAB$宽度,使得剩下的字符最少

题解:做前缀和,发现枚举$TAB$暴力求解是$O(nlog_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
", ans);
	return 0;
}

  

原文地址:https://www.cnblogs.com/Memory-of-winter/p/9799455.html