题目传送门:我是题目
题目的大意是:先给出一行m和n,分别代表学生数和课程数,接下来有m行,每行一次是:学生姓名,学生选课数,后面的数字是课程编号。需要依次输出每个课程的编号,选这个课的学生数 以及选这个课的学生姓名。
学习之处:这个题目跟上面那个题目差不多,但是我现在学会了string如何存在vector里面。这个解法特别有意思,代码量特别少,待我细细道来。
代码:
#include<bits/stdc++.h>
using namespace std;
vector<string>v[50002];
int main(){
int m,n;
scanf("%d %d",&m,&n);
for(int i = 0 ;i <m;i++){
int num,no;
string name;
cin>>name>>num;
for(int j = 0 ; j<num;j++){
scanf("%d",&no);
v[no].push_back(name);
}
}
for(int i = 1 ;i <= n;i++){
printf("%d %d\n",i,v[i].size());
sort(v[i].begin(),v[i].end());
for(int j=0;j<v[i].size();j++){
printf("%s\n",v[i][j].c_str());
}
}
}
- 有意思的地方:
- 先声明一个vector<string> v
- cin 读入string
- v.push_back将其加入到这个vector
- 用v.c_str()就能将这个字符串输出达到了string在vector里面的存取
- 如果不知道这个头文件<bits/stdc++.h>是在干啥,请点击这里:我是链接
- 要注意的地方:
- 用cout有可能会面临超时的问题,所以要用v.c_str()
- 名字需要排序
- !!!最重要的 因为课程序号是从1开始的,所以这种写法存起来的名字数据是从v[1]开始的,所以读取的时候一定要记得for要从1开始,结束条件对应的也要变成<= n.