一:题目

假设全校有最多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

二:思路

思路:1.用map容器<int,string>;每门课对应一群学生
2.然后截取字符串,题目给出的是名字是的格式是固定的
3.然后用vector容器 用其sort方法排序的功能(字典序也就是 sort()排序 )

三:上码

方法一:

/**思路:1.用map容器<int,string>;每门课对应一群学生2.然后截取字符串,题目给出的是名字是的格式是固定的3.然后用vector容器 用其sort方法排序的功能(字典序也就是 sort()排序 )
*/
#include<bits/stdc++.h>
using namespace std;
map<int,string>m1;
map<int,string>::iterator mt;int main(){int N,K;int count = 1;cin >> N >> K;for( int i = 0; i < N; i++ ){char ch[6];scanf("%s",ch);int n;cin >> n;for( int j = 0; j < n; j++){int course;cin >> course;m1[course] += ch;}        }for( mt = m1.begin(); mt != m1.end(); mt++){vector<string>v;string str = mt->second;if( mt->first != count){cout << count << ' ' << "0" << endl; }count++;printf("%d %d\n",mt->first,str.size() / 4);for( int i = 0; i < str.size(); i = i + 4 ){v.push_back(str.substr(i,4));}sort(v.begin(),v.end());for( int i = 0; i < v.size(); i++ ){printf("%s\n",(v[i]).c_str());}}} //10 5
//ZOE1 2 4 5
//ANN0 3 5 2 1
//BOB5 4 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

方法二:

/**思路:用vector的一对多 即一个课程编号对应好几个名字 */
#include<bits/stdc++.h>
using namespace std;int main(){int N,K;vector <string> v[2600];scanf("%d%d",&N,&K);for(int i = 0; i < N; i++){int nums;char name[6];scanf("%s%d",name,&nums);for(int j = 0; j < nums; j++){int course;scanf("%d",&course);v[course].push_back(name);} } for(int i = 1; i <= K; i++){printf("%d %d\n",i,v[i].size());sort(v[i].begin(),v[i].end());//       for(string name:v[i]){//          printf("%s\n",name.c_str());
//      }for(int j = 0; j < v[i].size(); j++){printf("%s\n",v[i][j].c_str());}}}

四:超时解决:

本题当中,需要把输出输出改为scanf 和printf 否则最后一个点会出现超时问题

五:知识速递(vector和map的基本用法 不了解的兄弟们可以学一下哈)

map的基本用法
vector的基本用法

六:记录失败码

这个码在处理学生的具体名字时,我用的是set容器,但是最后一个测试点过不去,用cin cout 就运行超时,换成sancf 和printf就答案错误 脑壳疼。我就换成vector ,然后就和过去了。

/**思路:1.用map容器<int,string>;每门课对应一群学生2.然后截取字符串,题目给出的是名字是的格式是固定的3.然后用set容器 用其自动排序的功能(字典序也就是 sort()排序 )
*/
#include<bits/stdc++.h>
using namespace std;int main(){int N,K;int count = 1;map<int,string>m1;map<int,string>::iterator mt;cin >> N >> K;for( int i = 0; i < N; i++ ){string name;cin >> name;int n;cin >> n;for( int j = 0; j < n; j++){int course;cin >> course;m1[course] += name;}        }for( mt = m1.begin(); mt != m1.end(); mt++){set<string>s1;set<string>::iterator st;string str = mt->second;if( mt->first != count){cout << count << ' ' << "0" << endl;    }count++;cout << mt->first << ' ' << str.size() / 4 << endl;for( int i = 0; i < str.size(); i = i + 4 ){s1.insert(str.substr(i,4));    }for( st = s1.begin(); st != s1.end(); st++ ){cout << *st << endl;}}} //10 5
//ZOE1 2 4 5
//ANN0 3 5 2 1
//BOB5 4 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

7-47 打印选课学生名单 (25 分)(两种做法)(思路加详解+map+vector做法+最后一个点超时解决)+兄弟们冲丫丫相关推荐

  1. 打印选课学生名单 (25分)

    打印选课学生名单 (25分) 假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000),为 ...

  2. 5 打印选课学生名单 (25分)

    5 打印选课学生名单 (25分) 假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000) ...

  3. 5 打印选课学生名单 (25 分)

    5 打印选课学生名单 (25 分) 假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000 ...

  4. 7-47 打印选课学生名单 (25分))

    7-47 打印选课学生名单 (25分) 假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤400 ...

  5. 7-47 打印选课学生名单 (25分)C++

    假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000),为全校学生总数:K(≤2500) ...

  6. PTA 7-47 打印选课学生名单 (25 point(s))

    假设全校有最多40000名学生和最多2500门课程.现给出每个学生的选课清单,要求输出每门课的选课学生名单. 输入格式: 输入的第一行是两个正整数:N(≤40000),为全校学生总数:K(≤2500) ...

  7. 7-2 一元多项式的乘法与加法运算 (20 分)(思路加详解+map做法)map真香啊 各个测试点的用例子 来吧宝贝!

    一:题目 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以 ...

  8. 7-2 旅行售货员 (10 分)(TSP问题思路加详解)

    一题目 某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费).他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(或总旅费)最小. 输入格式: 第一行为城市数n 下面n ...

  9. 7-7 有重复元素的全排列 (10 分)(set容器做法思路加详解)

    一:题目 计算给定的n个数有多少种排列方式,即求全排列(可能出现重复的元素) 输入格式: 第一行输入数字的数量n(n>2),第二行给出每一个数字. 输出格式: 一个数字,不同排列方式的数量. 输 ...

最新文章

  1. python中in_python中的min和in用代码实现
  2. 【Android NDK 开发】Ubuntu 函数库交叉编译 ( Android 动态库交叉编译 | Android 静态库交叉编译 )
  3. 如何升级cordova插件
  4. 连接MySQL数据库时常见故障问题的分析与解决
  5. git 怎么拉去分支代码_Git使用技巧1——代码写错分支了怎么办?
  6. 当你打开天猫的那一刻,推荐系统做了哪些工作?
  7. The Network Adapter could not establish the connection解决
  8. Unix下C程序内存泄露检测工具:valgrind的安装使用
  9. OpenDocument Format ODF
  10. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_1_字符输入流_Reader类FileRead...
  11. Kaggle Future Sales“”竞赛 XGB_model_final
  12. java spark命令行执行参数
  13. hrbust/哈理工oj 1475国王的宴会【树型dp】
  14. java excel 取消科学计数法_java使用poi解析或处理excel的时候,如何防止数字变成科学计数法的形式...
  15. java中注解 详解
  16. Android增强现实(三)-3D模型展示器
  17. 【采样算法】拉丁超立方采样
  18. 浙大版《C语言程序设计(第3版)》题目集(编程题q41-q50)
  19. 计算机网络检查方式,一种计算机网络环路检测方法与流程
  20. webrtc学习笔记二:webrtc介绍

热门文章

  1. java类sample是公共的_应在名samle.java的文件_Andoid NDK编程 1 - 注册native函数
  2. Android之RecycleView实现指定范围的拖动效果
  3. Android之android.system.ErrnoException: open failed: ENOENT (No such file or directory)
  4. java之RSA和Base64加密帮助类
  5. linux之快速过滤文本的关键字以及快速过滤目录下的关键字
  6. Android官方开发文档Training系列课程中文版:Android的安全建议 .
  7. solidity bytes 智能合约开发知识浅学(五点一)bytes基本概念
  8. linux磁盘第一个扇区分析,Linux磁盘分区
  9. php支持cs吗,关于composer、phpmd和phpcs于windows中的安装与使用方法
  10. 全球顶级大学,在中国录取率却不足0.5%,答案一针见血!