AtcoderABC248场

A - Lacked NumberA - Lacked Number

AtcoderABC248场_第1张图片AtcoderABC248场_第2张图片

题目大意

给定一个长度为9的字符串S,其中包含了0到9的所有数字,但只有一个数字缺失。需要找出缺失的数字并输出。

思路分析

为了找到缺失的数字,可以使用一个集合(unordered_set)来存储已经出现过的数字。遍历字符串S中的每个字符,将其转换为对应的数字,并将其插入集合中。然后,从0到9遍历所有数字,检查是否存在于集合中。如果某个数字不存在于集合中,则说明该数字是缺失的数字。

时间复杂度

O(1)

AC代码

#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;
}

B - SlimesB - Slimes

AtcoderABC248场_第3张图片AtcoderABC248场_第4张图片

题目大意

小清一开始有A个史莱姆,每次叫喊后,史莱姆数量都会成倍增加。为了拥有B个或更多史莱姆,小清至少需要叫喊多少次。

思路分析

使用一个循环来模拟每次叫喊后史莱姆数量的增长,直到数量达到或超过BB。

时间复杂度

O(logB)

AC代码

#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;
}

C - Dice SumC - Dice Sum

AtcoderABC248场_第5张图片AtcoderABC248场_第6张图片

题目大意

计算满足以下条件的长度为N的整数序列A=(A1,…,AN)有多少种:

  • 1≤Ai≤M (1≤i≤N)
  • ∑Ai≤K

由于计数可能会非常大,需要对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)

AC代码

#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;
}

你可能感兴趣的:(算法)