题解
终于!比较顺地做出来一道题!YEAH!!
感觉自己的思路还是比较顺的~
#include <bits/stdc++.h>
using namespace std;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,m,k;
cin>>n>>m;
string student;
unordered_set<string> name;
for(int i=0; i<m; i++)
{
cin>>student;
name.insert(student);
}
int cnt_stu=0,cnt_obj=0;
for(int i=0; i<n; i++){
cin>>student>>k;
string ob[k];
bool flag=false;
for(int j=0;j<k;j++){
cin>>ob[j];
if(!flag&&name.find(ob[j])!=name.end()){
flag=true;
cnt_stu++;
cout<<student+":";
}
if(flag&&name.find(ob[j])!=name.end()){
cnt_obj++;
cout<<" "<<ob[j];
}
}
if(flag) cout<<endl;
}
cout<<cnt_stu<<" "<<cnt_obj<<endl;
return 0;
}
柳神方法
柳神用的是哈希的方法(空间换取时间),感觉也挺简单的。
分析:bool类型的forbid存储禁止携带的物品,如果需要被查缴则赋值为true;flag变量表示当前学生是否已经输出过姓名,一开始flag=false,当前学生如果有需要被查缴的物品且还未输出过他的姓名,则输出name,并令flag=true;如果有需要被查缴的物品且已经输出过姓名,则输出该物品的编号,因为编号为4位数字,不满4位要在前面补0,所以用%04d输出,并将被查缴物品的总数fnum++,最后如果当前学生已经输出过姓名,则输出一个空行,并将学生的总人数snum++,最后输出snum和fnum的值~
#include <iostream>
#include <algorithm>
using namespace std;
bool forbid[10000];
int main() {
int n, m, temp, k, snum = 0, fnum = 0;
scanf("%d %d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d", &temp);
forbid[temp] = true;
}
for (int i = 0; i < n; i++) {
char name[10];
bool flag = false;
scanf("%s %d", name, &k);
for (int j = 0; j < k; j++) {
scanf("%d", &temp);
if (forbid[temp]) {
if (!flag) {
printf("%s:", name);
flag = true;
}
printf(" %04d", temp);
fnum++;
}
}
if (flag) {
printf("\n");
snum++;
}
}
printf("%d %d\n", snum, fnum);
return 0;
}