题目链接:https://codeforces.com/contest/1032
A - Kitchen Utensils
题意:举办一场宴会,有 \(k\) 个人,每个人都消耗同样份数的餐具,且每份餐具中每种餐具至多一个。宴会结束发现有些餐具被偷了,已知剩下 \(n\) 个餐具,这 \(n\) 个餐具分别是第 \(a_i\) 种餐具。求至少被偷了多少个餐具。
题解:首先把出现最多的餐具找出来,对人数取上整,就是最少的餐具份数。再统计一份餐具最少有几种。
int cnt[105];
void test_case() {
int n, k;
scanf("%d%d", &n, &k);
for(int i = 1, x; i <= n; ++i) {
scanf("%d", &x);
++cnt[x];
}
sort(cnt + 1, cnt + 1 + 100, greater());
int num = (cnt[1] + k - 1) / k * k;
int siz = 0;
for(int i = 1; i <= 100; ++i)
siz += cnt[i] ? 1 : 0;
printf("%d\n", num * siz - n);
}
B
char s[105];
bool check(int r) {
int n = strlen(s + 1);
int c = (n + r - 1) / r;
if(c > 20)
return false;
printf("%d %d\n", r, c);
int rest = r * c - n;
int top = 0;
for(int i = 1; i <= r; ++i) {
for(int j = 1; j < c; ++j)
printf("%c", s[++top]);
if(rest) {
printf("*\n");
--rest;
} else
printf("%c\n", s[++top]);
}
return true;
}
void test_case() {
scanf("%s", s + 1);
for(int i = 1; i <= 5; ++i) {
if(check(i))
return;
}
}
C - Playing Piano
随便dp
int a[100005];
bool dp[100005][6];
int pre[100005][6];
void test_case() {
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
dp[1][1] = dp[1][2] = dp[1][3] = dp[1][4] = dp[1][5] = 1;
for(int i = 2; i <= n; ++i) {
if(a[i] > a[i - 1]) {
for(int j = 2; j <= 5; ++j) {
for(int k = 1; k < j; ++k) {
if(dp[i - 1][k]) {
dp[i][j] = 1;
pre[i][j] = k;
break;
}
}
}
} else if(a[i] < a[i - 1]) {
for(int j = 1; j <= 4; ++j) {
for(int k = j + 1; k <= 5; ++k) {
if(dp[i - 1][k]) {
dp[i][j] = 1;
pre[i][j] = k;
break;
}
}
}
} else {
for(int j = 1; j <= 5; ++j) {
for(int k = 1; k <= 5; ++k) {
if(k == j)
continue;
if(dp[i - 1][k]) {
dp[i][j] = 1;
pre[i][j] = k;
break;
}
}
}
}
/*for(int j = 1; j <= 5; ++j)
printf("%d", (int)pre[i][j]);
puts("");*/
}
for(int j = 1; j <= 5; ++j) {
if(dp[n][j] == 1) {
int cur = j;
for(int i = n; i >= 1; --i) {
a[i] = cur;
cur = pre[i][cur];
}
for(int i = 1; i <= n; ++i)
printf("%d%c", a[i], " \n"[i == n]);
return;
}
}
puts("-1");
return;
}