题目大意:给你$a_i$,表示第$i$行有$a_i$个空格,你需要确定一个$TAB$宽度,使得剩下的字符最少
题解:做前缀和,发现枚举$TAB$暴力求解是$O(n\log_2n)$的,完全可以过
卡点:无
C++ Code:
#include#include #define maxn 1000010const 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;}