1072 开学寄语 (20 分)
下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其 QQ,封其电脑,夺其手机,收其 ipad,断其 wifi,使其百无聊赖,然后,净面、理发、整衣,然后思过、读书、锻炼、明智、开悟、精进。而后必成大器也!
本题要求你写个程序帮助这所学校的老师检查所有学生的物品,以助其成大器。
输入格式:
输入第一行给出两个正整数 N(≤\le≤ 1000)和 M(≤\le≤ 6),分别是学生人数和需要被查缴的物品种类数。第二行给出 M 个需要被查缴的物品编号,其中编号为 4 位数字。随后 N 行,每行给出一位学生的姓名缩写(由 1-4 个大写英文字母组成)、个人物品数量 K(0 ≤\le≤ K ≤\le≤ 10)、以及 K 个物品的编号。
输出格式:
顺次检查每个学生携带的物品,如果有需要被查缴的物品存在,则按以下格式输出该生的信息和其需要被查缴的物品的信息(注意行末不得有多余空格):
姓名缩写: 物品编号1 物品编号2 ……
最后一行输出存在问题的学生的总人数和被查缴物品的总数。
输入样例:
4 2
2333 6666
CYLL 3 1234 2345 3456
U 4 9966 6666 8888 6666
GG 2 2333 7777
JJ 3 0012 6666 2333
输出样例:
U: 6666 6666
GG: 2333
JJ: 6666 2333
3 5
思路
使用了三个for
循环嵌套,还好数据量较小,要不然肯定超时。
以每个学生的单个物品和需要查询的物品做比对,查询到了,输出,如果该学生没有违禁品,则不做处理。
具体如注释。
代码
#include <iostream>
using namespace std;
int main()
{
int N, M, m[7] = { 0 }, mNum, mNums;
scanf("%d %d", &N, &M);
for (int i = 0; i < M; i++)
scanf("%d", &m[i]);
char s[5];
int nSumN = 0, nSumM = 0;
for (int i = 0; i < N; i++) { //输入N行学生
cin >> s >> mNum; //姓名 和 物品数量
bool flag = true; //默认为true
for (int j = 0; j < mNum; j++) { //输入单个物品
cin >> mNums;
for (int x = 0; x < M; x++) { //将单个物品 和 M个物品做对比
if (m[x] == mNums) { //如果查到该物品
if (flag) { //首次输出 先输出学生姓名
printf("%s:", s);
flag = false;
nSumN++; //学生计数
}
printf(" %04d", m[x]); //输出该物品
nSumM++; //物品计数
}
}
}
if (!flag) //输出一个学生信息之后换行,如果不输出学生信息则不处理
printf("\n");
}
printf("%d %d", nSumN, nSumM);
return 0;
}