zoukankan      html  css  js  c++  java
  • 数据结构与算法题目集(中文)7-47 打印选课学生名单 (25分) (一对多结构使用vector向量数组)

    1.题目

    假设全校有最多40000名学生和最多2500门课程。现给出每个学生的选课清单,要求输出每门课的选课学生名单。

    输入格式:

    输入的第一行是两个正整数:N(≤40000),为全校学生总数;K(≤2500),为总课程数。此后N行,每行包括一个学生姓名(3个大写英文字母+1位数字)、一个正整数C(≤20)代表该生所选的课程门数、随后是C个课程编号。简单起见,课程从1到K编号。

    输出格式:

    顺序输出课程1到K的选课学生名单。格式为:对每一门课,首先在一行中输出课程编号和选课学生总数(之间用空格分隔),之后在第二行按字典序输出学生名单,每个学生名字占一行。

    输入样例:

    10 5
    ZOE1 2 4 5
    ANN0 3 5 2 1
    BOB5 5 3 4 2 1 5
    JOE4 1 2
    JAY9 4 1 2 5 4
    FRA8 3 4 2 5
    DON2 2 4 5
    AMY7 1 5
    KAT3 3 5 4 2
    LOR6 4 2 4 1 5
    

    输出样例:

    1 4
    ANN0
    BOB5
    JAY9
    LOR6
    2 7
    ANN0
    BOB5
    FRA8
    JAY9
    JOE4
    KAT3
    LOR6
    3 1
    BOB5
    4 7
    BOB5
    DON2
    FRA8
    JAY9
    KAT3
    LOR6
    ZOE1
    5 9
    AMY7
    ANN0
    BOB5
    DON2
    FRA8
    JAY9
    KAT3
    LOR6
    ZOE1

    2.题目分析

    1.数据结构使用vector<string> list[2501]; (参见https://blog.csdn.net/chen_zan_yu_/article/details/84671823

    2.注意结尾的c_str()函数,因为在vector向量中声明的类型是string,但是用scanf输入使用的char*,将string转换为char*是用c_str()函数

    具体用法:(参见https://blog.csdn.net/u013682388/article/details/39547773#

    //标准库的string类提供了三个成员函数来从一个string得到c类型的字符数组
    //主要介绍c_str
    //c_str():生成一个const char*指针,指向以空字符终止的数组。
    //这个数组应该是string类内部的数组
    #include <iostream>
    //需要包含cstring的字符串
    #include <cstring>
    using namespace std;
     
    int main()
    {
    	//string-->char*
    	//c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同
     
    	//这个数组的数据是临时的,当有一个改变这些数据的成员函数被调用后,其中的数据就会失效。
    	//因此要么现用先转换,要么把它的数据复制到用户自己可以管理的内存中
    	const char *c;
    	string s = "1234";
    	c = s.c_str();
    	cout<<c<<endl;
    	s = "abcde";
    	cout<<c<<endl;
    }

    其实上面的c = s.c_str(); 不是一个好习惯。既然c指针指向的内容容易失效,我们就应该按照上面的方法,那怎么把数据复制出来呢?这就要用到strcpy等函数(推荐)。

    //标准库的string类提供了三个成员函数来从一个string得到c类型的字符数组
    //主要介绍c_str
    //c_str():生成一个const char*指针,指向以空字符终止的数组。
    //这个数组应该是string类内部的数组
    #include <iostream>
    //需要包含cstring的字符串
    #include <cstring>
    using namespace std;
     
    int main()
    {
    	//更好的方法是将string数组中的内容复制出来 所以会用到strcpy()这个函数
    	char *c = new char[20];
    	string s = "1234";
    	// c_str()返回一个客户程序可读不可改的指向字符数组的指针,不需要手动释放或删除这个指针。
    	strcpy(c,s.c_str());
    	cout<<c<<endl;
    	s = "abcd";
    	cout<<c<<endl;
    }

     3.代码

    #include<iostream>
    #include<vector>
    #include<string>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    vector<string> list[2501];
    int main()
    {
    	int n, k;
    	cin >> n >> k;
    	for (int i = 0; i < n; i++)
    	{
    		char name[5];
    		scanf("%s", name) ;
    		int amount;
    		scanf("%d",&amount);
    		for (int j = 0; j < amount; j++)
    		{
    			int classnum;
    			scanf("%d", &classnum);
    			list[classnum].push_back(name);
    		}
    	
    	}
    	for (int i = 1; i <=k; i++)
    	{
    		sort(list[i].begin(), list[i].end());
    		printf("%d %d
    ", i, list[i].size());
    		for (int j=0;j<list[i].size();j++)
    		{
    			printf("%s
    ", list[i][j].c_str());//注意这里!!
    		}
    	}
    
    
    }
  • 相关阅读:
    深入理解计算机操作系统(十)
    深入理解计算机操作系统(九)
    深入理解计算机操作系统(八)
    深入理解计算机操作系统(七)
    深入理解计算机操作系统(六)
    深入理解计算机操作系统(五)
    mysql创建新用户
    沙特女性终于开车上路,仍有男性对此不爽
    为什么人们爱听有声书?
    韩流来袭,英文歌曲的垄断地位被撼动
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12788992.html
Copyright © 2011-2022 走看看