本专栏持续输出数据结构题目集,欢迎订阅。
题目
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
题目引用自睿抗机器人开发者大赛真题(2023年)。
代码
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX_NAME_LEN 31 // 饮料名称最大长度
#define MAX_KNOWN 100 // 已知饮料最大数量
// 存储已知饮料及其等级的结构体
typedef struct {
char name[MAX_NAME_LEN];
char level;
} Drink;
// 查找饮料名称是否在已知列表中,返回等级,未找到返回0
char findLevel(Drink known[], int n, char* name) {
for (int i = 0; i < n; i++) {
if (strcmp(known[i].name, name) == 0) {
return known[i].level;
}
}
return 0;
}
int main() {
int N, M;
scanf("%d %d", &N, &M);
Drink known[MAX_KNOWN];
// 读取已知饮料及其等级
for (int i = 0; i < N; i++) {
scanf("%s %c", known[i].name, &known[i].level);
}
// 处理每个需要定级的饮料
for (int i = 0; i < M; i++) {
char drink[MAX_NAME_LEN];
scanf("%s", drink);
int len = strlen(drink);
// 检查是否为已知饮料
char level = findLevel(known, N, drink);
if (level != 0) {
printf("%c\n", level);
continue;
}
// 尝试拆解为两个已知饮料的组合
char firstLevel = 0, secondLevel = 0;
int count = 0; // 有效拆解方法的数量
// 遍历所有可能的拆分位置
for (int split = 1; split < len; split++) {
char part1[MAX_NAME_LEN] = {0};
char part2[MAX_NAME_LEN] = {0};
// 分割为两部分
strncpy(part1, drink, split);
part1[split] = '\0';
strcpy(part2, drink + split);
// 检查两部分是否都是已知饮料
char l1 = findLevel(known, N, part1);
char l2 = findLevel(known, N, part2);
if (l1 != 0 && l2 != 0) {
count++;
// 记录第一次有效拆解的等级
if (count == 1) {
firstLevel = l1;
secondLevel = l2;
}
}
}
// 根据拆解结果输出等级
if (count == 1) {
printf("%c%c\n", firstLevel, secondLevel);
} else {
printf("D\n");
}
}
return 0;
}
1834

被折叠的 条评论
为什么被折叠?



