AT278 题解

题目传送门

小学生又双叒叕来写题解啦!

我的思路是,先统计招牌与材料包中不同字母的数量。

然后,枚举二十六个字母。

对于每个字母,用招牌字母数除以材料包字母数,再向上取整

这样可以得到单个字母所需的材料包数量。

取这些数中最大值即可。

还有两个问题。

一是如何判断无解

只需在枚举过程中检查,若招牌里需要某字母,但材料包里没有,显然无法制作。

但第二个问题很容易忽略。

如果在招牌字母数除以材料包字母数的时候,材料包字母数恰为零,这可怎么办?

因此,为了提防除以零的尴尬情况,我们需要特判。

送上满分代码:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int cntS[35], cntG[35];
int main()
{
	//以下为输入,并且存储字母个数。 
	int lenS, lenG;
	scanf("%d%d", &lenS, &lenG);
	string s, g;
	cin >> s >> g;
	for (int i = 0; i < lenS; i++) cntS[s[i] - 'A' + 1]++;
	for (int i = 0; i < lenG; i++) cntG[g[i] - 'A' + 1]++;
	
	int maxn = -1;
	for (int i = 1; i <= 26; i++)
	{
		if (cntS[i] != 0 && cntG[i] == 0)  //招牌需要,但材料包里没有。 
		{
			printf("-1\n");
			return 0;
		}
		if (cntS[i] == 0 && cntG[i] == 0) continue;  //防止除零事件发生。 
		int t = ceil(1.0 * cntS[i] / cntG[i]);
		maxn = max(maxn, t);
	}
	printf("%d\n", maxn);  //题目要求要换行。 
	return 0;
}

首发:2022-01-31 21:12:24

posted @ 2022-08-25 00:02  liangbowen  阅读(11)  评论(0编辑  收藏  举报