7-47 打印选课学生名单 (25 分)(两种做法)(思路加详解+map+vector做法+最后一个点超时解决)+兄弟们冲丫丫
一:題目
假設全校有最多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做法+最后一个点超时解决)+兄弟们冲丫丫的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: photoshop人脸怎么颜色合成(ps
- 下一篇: ps怎么画一个超出图片的面板(ps怎么画