RC-u2 出院
题目描述
A:最近出了一个饮料营养等级你们知道吗?例如无糖的饮料是 A 级,可乐是 D 级……
B:那……无糖可乐是什么级别?
C:AD 级吧。
A:出院!
B:出什么院,你也给我进去!
以上是某群中一段有趣的对话。请你按照里面的逻辑,在已知某些饮料的等级的情况下,给饮料定级。定级的方法是:
- 如果是已知等级的饮料,直接输出等级;
- 对于一个新饮料的名字,你需要将名字拆成两个已知等级的部分,然后输出这个级别。例如:Diet是A,Coke是D,那么DietCoke就是AD;
- 如果新饮料无法拆解或者有多种拆解方法,统一定为 D 级。
输入格式:
输入第一行是两个正整数 N,M (1≤N,M≤100),表示已知的饮料有 N 种,需要定级的饮料有 M 种。
接下来首先是 N 行,每行是一个字符串和一个字符,表示一种饮料的名字和对应的等级,等级只有 A,B,C,D 四种。
然后是 M 行,每行是一个字符串,表示需要定级的饮料的名字。
所有饮料名字只包含有大小写字母,长度不超过 30,给定拥有等级的饮料的名字不会重复。
输出格式:
对于每一个需要定级的饮料,输出定好的定级。
输入样例:
5 6
Diet A
LowSugarTea B
Milk C
Coke D
Water A
DietCoke
Pepsi
Milk
CokeWater
GoodMilk
dietCoke
输出样例:
AD
D
C
DA
D
D
模拟
以下是对给定代码的详细注释,解释了代码的每一部分的功能和目的:
// 包含标准输入输出流库, 方便进行输入输出操作
#include<bits/stdc++.h>
// 使用std命名空间, 避免在每个标准库函数前加std::
using namespace std;
// s数组用于存储已知饮料的名字, a数组用于存储已知饮料的等级
string s[110], a[110];
// 主函数
int main()
{
int n, m; // n表示已知饮料的数量,m表示需要定级的饮料的数量
cin >> n >> m; // 读入已知饮料数量和需要定级的饮料数量
// 循环读入已知饮料的信息
for(int i = 0; i < n; i++)
{
cin >> s[i] >> a[i]; // 读入饮料名和对应的等级
}
// 循环处理每个需要定级的饮料
for(int i = 0; i < m; i++)
{
string b; // 用于存储需要定级的饮料名
cin >> b; // 读入需要定级的饮料名
int flag = 0; // 标志位,用于标记饮料是否可以通过已知饮料拆解得到
int flag1 = 0; // 标志为,用于标记饮料是否已经在已知饮料中找到
string x, y; // x和y用于存储拆解得到的两个已知饮料的等级
// 遍历已知饮料,寻找能否拆解
for(int j = 0; j < n; j++)
{
// 如果需要定级的饮料名直接在已知饮料中找到
if(b == s[j])
{
x = a[j]; // 获取该饮料的等级
flag = 1; // 设置标志位,表示已找到
flag1 = 1; // 设置标志位,表示无需拆解
break; // 跳出循环
}
// 如果没有直接找到,尝试进行拆解
for(int k = 0; k < n; k++)
{
string t = s[j] + s[k]; // 将两个已知饮料名拼接在一起
// 如果拼接后的饮料名与需要定级的饮料名相同
if(t == b)
{
x = a[j]; // 获取第一个饮料的等级
y = a[k]; // 获取第二个饮料的等级
flag++; // 增加标志位
}
}
}
// 根据标志位的情况输出结果
if(flag == 0 && flag1 == 0) cout << "D" << endl; // 如果无法拆解,且没找到,输出D
else if(flag == 1 && flag1 == 0) cout << x << y << endl; // 如果可以拆解,输出拆解后的等级
else if(flag == 1 && flag1 == 1) cout << x << endl; // 如果直接找到,输出对应等级
else cout << "D" << endl; // 如果有多种拆解方法,输出D
}
return 0; // 程序正常结束
}
上面的程序实现了定级饮料的逻辑。首先读取已知饮料的等级和需要定级的饮料的信息。之后,对于每一个需要定级的饮料,程序检查它是否已经有了已知等级,或者是否可以通过将两个已知等级的饮料名拼接来得到。如果可以拼接且仅有一种方式拼接,输出这两个等级。如果有多种拼接方式或找不到匹配,输出默认的"D"等级。