小学生又双叒叕来写题解啦!
我的思路是,先统计招牌与材料包中不同字母的数量。
然后,枚举二十六个字母。
对于每个字母,用招牌字母数除以材料包字母数,再向上取整。
这样可以得到单个字母所需的材料包数量。
取这些数中最大值即可。
还有两个问题。
一是如何判断无解。
只需在枚举过程中检查,若招牌里需要某字母,但材料包里没有,显然无法制作。
但第二个问题很容易忽略。
如果在招牌字母数除以材料包字母数的时候,材料包字母数恰为零,这可怎么办?
因此,为了提防除以零的尴尬情况,我们需要特判。
送上满分代码:
#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
标签:lenG,int,题解,字母,AT278,++,include From: https://www.cnblogs.com/liangbowen/p/16622762.html