「CROI · R1」浣熊的语言 题解
出题人题解。
题意简述
有
有一个适用于每个单词的遗忘曲线数组
问几天可以学完单词(从数值为
解题思路
本题根据题意模拟即可。枚举每一个单词的新学时间,再加上
......
是这样的吗?这样的时间复杂度
需要注意的是我们并不关心具体某个单词,只关心每天学习单词数量。而且单词多个复习点重叠不需要进行去重,并且所有单词遗忘曲线相同,所以使用数组累加答案。用数组 new_words 累加新学单词数量(以下简称 old_words 累加复习单词数量(以下简称
因为只关心学习单词个数,所以读入数组
因此从
在累加复习单词数量的同时,记录
对于
由于数组
AC code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, m, k;
int d[1000006], s[1003], t[1005];
int new_word[1001006];
int old_word[1001006];
int main() {
scanf("%d%d%d", &n, &m, &k);
int maxd = 0;
for (int i = 1; i <= n; i ++) {
scanf("%d", &d[i]);
new_word[d[i]] ++;
maxd = max(maxd, d[i]);
}
for (int i = 1; i <= m; i ++) {
scanf("%d", &s[i]);
}
for (int i = 1; i <= k; i ++) {
scanf("%d", &t[i]);
}
for (int i = 1; i <= m; i ++) {
new_word[s[i] + 1] += new_word[s[i]];
new_word[s[i]] = 0;
}
for (int i = 1; i <= maxd; i ++) {
if (new_word[i] != 0) {
for (int j = 1; j <= k; j ++) {
old_word[i + t[j]] += new_word[i];
maxd = max(maxd, i + t[j]);
}
}
}
for (int i = 1; i <= m; i ++) {
new_word[s[i] + 1] += new_word[s[i]];
new_word[s[i]] = 0;
old_word[s[i] + 1] += old_word[s[i]];
old_word[s[i]] = 0;
}
while (new_word[maxd] == 0 and old_word[maxd] == 0) maxd --;
printf("%d\n", maxd);
for (int i = 1; i <= maxd; i ++) {
printf("%d %d\n", new_word[i], old_word[i]);
}
return 0;
}