问题描述
输出携带违规物品的同学姓名以及携带违规品的编码
最后输出带违规品的同学数目以及违规品总数。
题目分析
我们以字符串的形式输入违规品编号,然后将其放入map中,value为1,方便后面判断同学携带的物品是不是违规品。
然后我们将每个同学和携带物品用getline以字符串形式输入,如果其有携带违规品,我们则map[物品编号]==1
,我们就将违规物品放入一个string类型的vector中,最后我们输出学生姓名以及其携带的违规品即可。
对于学生姓名和违规品的存储,我们都用遍历字符串并且字符出拼接的方法完成。每次遍历新的字符串时,要将这两个字符串清空。
代码
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main()
{
int m,n;
cin>>m>>n;//学生人数和违规物品数目
map<string,int>disobey;//所有违规物品的map
string id;
while (cin>>id)
{
disobey[id]=1;
if(cin.get() == '\n')
break;
}
string s;//同学姓名以及所携带的物品作为字符串输入
int sum = 0;//违规物品的总数
int count = 0;//违规学生的数目
for(int i = 0;i < m;i++)
{
vector<string>fault;//违规物品数组
string ss = "";//学生姓名,字符串拼接形式输入
string sss = "";//物品编号,字符串拼接形式输入
getline(cin,s);//输入学生姓名以及携带的物品
for(int j = 0;j < s.length();j++)
{
//如果不是数字也不是空格,说明是姓名,与ss拼接在一起即可
if(!isdigit(s[j]) && s[j] != ' ')
{
ss += s[j];
}
//如果是数字,说明是物品id,与sss拼接即可
else if(isdigit(s[j]))
{
sss+=s[j];
}
else
{
//遇到空格时说明当前编号字符串到头了
//先判断是否为违规品,如果是则加入违规品数组中,然后将其置为空串
if(disobey[sss] == 1)
{
fault.push_back(sss);
}
sss = "";
}
}
//最后一个物品id由于不会遇到空格,因此无法加入,需要单独判断
if(disobey[sss] == 1)
fault.push_back(sss);
//该学生有违规品
if (fault.size() != 0)
{
cout<<ss<<": ";
count++;
}
//该学生无违规品
else
{
continue;
}
for(int k = 0;k < fault.size();k++)
{
if(k != fault.size() - 1)
cout<<fault[k]<<" ";
else
cout<<fault[k]<<endl;
}
//违规品数目
sum += fault.size();
}
cout<<count<<" "<<sum<<endl;
return 0;
}
答题用时13min
Q72——finish√