P8016 [COCI2013-2014#4] ČOKOLADE 题解
题意
见洛谷。
分析
暴力很好想。
直接暴力枚举第
当天数大于
很显然会被卡到
不难发现枚举
我们对于一个
这便是数论分块的板子,这里不过多介绍,还不懂的同学可去 OI Wiki 上学习。
我们对于每个
温馨提示:这题有点卡常,需要一定卡常技巧才能过。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 105, inf = 0x3f3f3f3f;
int n, a[N], ans[N];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
sort(a + 1, a + n + 1);
memset(ans, -1, sizeof ans);
for (int i = 1; i <= a[n] + 1; i++) {
int sum = 0, k = inf;
for (int j = 1; j <= n + 1; j++) {
if (j == n + 1 || a[j] / i != a[j - 1] / i) {
if (ans[sum] == -1)
ans[sum] = i;
ans[sum] = min(ans[sum], i);
sum = 0;
}
sum++;
}
for (int j = 1; j <= n; j++) {
if (a[j] / i)
k = min(k, a[j] / (a[j] / i));
}
i = k;
}
for (int i = 1; i <= n; i++) {
printf("%d\n", ans[i]);
}
return 0;
}
总结
- 数论分块的板子吧,也可对于这种向下取整的枚举我们就应该要想到数论分块的。