pat 甲级 A1047 Student List for Course (25 分)(string在vector存取)

题目传送门:我是题目

题目的大意是:先给出一行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());
        }
    }
}
  • 有意思的地方:
  1. 先声明一个vector<string> v
  2. cin 读入string
  3. v.push_back将其加入到这个vector
  4. 用v.c_str()就能将这个字符串输出达到了string在vector里面的存取
  5. 如果不知道这个头文件<bits/stdc++.h>是在干啥,请点击这里:我是链接
  • 要注意的地方:
  1. 用cout有可能会面临超时的问题,所以要用v.c_str()
  2. 名字需要排序
  3. !!!最重要的 因为课程序号是从1开始的,所以这种写法存起来的名字数据是从v[1]开始的,所以读取的时候一定要记得for要从1开始,结束条件对应的也要变成<= n.
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值