给定一个长度为9的字符串S,其中包含了0到9的所有数字,但只有一个数字缺失。需要找出缺失的数字并输出。
为了找到缺失的数字,可以使用一个集合(unordered_set)来存储已经出现过的数字。遍历字符串S中的每个字符,将其转换为对应的数字,并将其插入集合中。然后,从0到9遍历所有数字,检查是否存在于集合中。如果某个数字不存在于集合中,则说明该数字是缺失的数字。
O(1)
#include
#include
#include
using namespace std;
int main() {
string s;
cin >> s;
unordered_set<int> digits;
for (char c : s) {
int digit = c - '0';
digits.insert(digit);
}
for (int i = 0; i <= 9; i++) {
if (digits.count(i) == 0) {
cout << i << endl;
break;
}
}
return 0;
}
小清一开始有A个史莱姆,每次叫喊后,史莱姆数量都会成倍增加。为了拥有B个或更多史莱姆,小清至少需要叫喊多少次。
使用一个循环来模拟每次叫喊后史莱姆数量的增长,直到数量达到或超过BB。
O(logB)
#include
using namespace std;
int main() {
long long a, b, k;
cin >> a >> b >> k;
int res = 0;
while (a < b) {
a *= k;
res++;
}
cout << res << endl;
return 0;
}
计算满足以下条件的长度为N的整数序列A=(A1,…,AN)有多少种:
由于计数可能会非常大,需要对998244353取模
使用动态规划来解决这个问题。定义dp[i][j]表示长度为i的序列满足条件∑ki=1Ai=j的数量。
首先,初始化dp数组,令dp[0][0]=1,并将其余元素填充为0。
然后,使用三重循环来计算dp数组的值。外层循环遍历序列长度i,中间循环遍历总和j,内层循环遍历每个元素的可能取值k。对于每个dp[i][j],通过累加dp[i-1][j-k]来计算,其中k的取值范围是1到M,并且要保证j-k大于等于0。
将dp数组的最后一行的所有元素相加得到答案。
O(NKM)
#include
#include
using namespace std;
using mint = atcoder::modint998244353;
int main() {
int n, m, K;
cin >> n >> m >> K;
vector<vector<mint>> dp(n + 1, vector<mint>(K + 1, mint(0)));
dp[0][0] = 1;
for(int i = 0; i < n; i++) {
for(int j = 0; j <= K; j++) {
for(int k = 1; k <= m; k++) {
if(j + k <= K) dp[i + 1][j + k] += dp[i][j];
}
}
}
mint res = 0;
for(int i = 1; i <= K; i++) {
res += dp[n][i];
}
cout << res.val() << endl;
}