7-49 打印学生选课清单 (25 分)(思路+详解+map做法(一对多)+超时解决)Come baby!
一:題目
假設(shè)全校有最多40000名學(xué)生和最多2500門課程。現(xiàn)給出每門課的選課學(xué)生名單,要求輸出每個前來查詢的學(xué)生的選課清單。
輸入格式:
輸入的第一行是兩個正整數(shù):N(≤40000),為前來查詢課表的學(xué)生總數(shù);K(≤2500),為總課程數(shù)。此后順序給出課程1到K的選課學(xué)生名單。格式為:對每一門課,首先在一行中輸出課程編號(簡單起見,課程從1到K編號)和選課學(xué)生總數(shù)(之間用空格分隔),之后在第二行給出學(xué)生名單,相鄰兩個學(xué)生名字用1個空格分隔。學(xué)生姓名由3個大寫英文字母+1位數(shù)字組成。選課信息之后,在一行內(nèi)給出了N個前來查詢課表的學(xué)生的名字,相鄰兩個學(xué)生名字用1個空格分隔。
輸出格式:
對每位前來查詢課表的學(xué)生,首先輸出其名字,隨后在同一行中輸出一個正整數(shù)C,代表該生所選的課程門數(shù),隨后按遞增順序輸出C個課程的編號。相鄰數(shù)據(jù)用1個空格分隔,注意行末不能輸出多余空格。
輸入樣例:
10 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 ZOE1 ANN0 BOB5 JOE4 JAY9 FRA8 DON2 AMY7 KAT3 LOR6輸出樣例:
ZOE1 2 4 5 ANN0 3 1 2 5 BOB5 5 1 2 3 4 5 JOE4 1 2 JAY9 4 1 2 4 5 FRA8 3 2 4 5 DON2 2 4 5 AMY7 1 5 KAT3 3 2 4 5 LOR6 4 1 2 4 5二:思路
思路:我們想要的結(jié)果是 一對多 即一個人對應(yīng)好幾個課程號,
可以用到map<string,vector>
我還考慮了vectorv[2500],但是vector中不能表示成 一個字符串對應(yīng)好幾個數(shù)
所以選擇了map
超時的話可以將cin 和 cout 改成 scanf 和 printf;
三:上碼
/**思路:我們想要的結(jié)果是 一對多 即一個人對應(yīng)好幾個課程號,可以用到map<string,vector<int>> 我還考慮了vector<int>v[2500],但是vector中不能表示成 一個字符串對應(yīng)好幾個數(shù)所以選擇了map */ #include<bits/stdc++.h> using namespace std;int main(){int N,K;map<string,vector<int> >m; // 注意vector<int> 后面得加上空格 map<string,vector<int> >::iterator t;scanf("%d%d",&N,&K);for(int i = 1; i <= K; i++){int nums,a;// cin >> i >> nums;scanf("%d%d",&a,&nums);//這里不要輸入 i即便i是從1開始的for(int j = 0; j < nums; j++){// string str;// cin >> str;char ch[6];scanf("%s",ch);m[ch].push_back(a); } }for(int i = 0; i < N; i++){char name[6];scanf("%s",name);printf("%s %d",name,m[name].size()); //m[name].size() 輸出一個人選擇了多少門課程 sort(m[name].begin(),m[name].end());//for(int temp : m[name]){//這里是for循環(huán)的增強(qiáng)版// printf(" %d",temp);//}//常規(guī)的for循環(huán)for(int j = 0; j < m[name].size(); j++){cout << ' ' << m[name][j]; } printf("\n");}}四:知識速遞(for循環(huán)的增強(qiáng)版和map的基本用法和vector的基本用法)
for循環(huán)的增強(qiáng)版
map的基本用法
vector的基本用法
五:總結(jié)(超時碼)
我自己寫的第一個碼,超時了,然后我就上網(wǎng)看了一下別人的思路,又寫了一個碼,學(xué)到了一對多的好東西,老樣子,記錄失敗的碼,
#include<bits/stdc++.h> using namespace std;int main(){int N,K;map<int,string>m;map<int,string>::iterator t;cin >> N >> K;for(int i = 1; i <= K; i++){int nums,a;// cin >> i >> nums;scanf("%d%d",&a,&nums);for(int j = 0; j < nums; j++){// string str;// cin >> str;char ch[6];scanf("%s",ch);m[a] += ch; } }for(int i = 0; i < N; i++){int count = 0;vector<int>v; // string name; // cin >> name;char name[6];scanf("%s",name);for(t = m.begin(); t !=m.end(); t++){string names = t->second;for(int j = 0; j < names.size(); j = j + 4){if(name == names.substr(j,4)){count++; v.push_back(t->first);break;} }} // cout << name << ' ' << count << ' ';printf("%s %d ",(name),count);for(int k = 0; k < v.size(); k++){if(k != v.size() - 1)printf("%d ",v[k]);elseprintf("%d\n",v[k]);} } } //10 5 //1 4 //ANN0 BOB5 JAY9 LOR6 //2 10 //ANN0 BOB5 FRA8 JAY9 JOE4 KAT3 LOR6 AMY7 DON2 ZOE1 //3 1 //BOB5 //4 7 //BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1 //5 9 //AMY7 ANN0 BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1 //ZOE1 ANN0 BOB5 JOE4 JAY9 FRA8 DON2 AMY7 KAT3 LOR6總結(jié)
以上是生活随笔為你收集整理的7-49 打印学生选课清单 (25 分)(思路+详解+map做法(一对多)+超时解决)Come baby!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑如何修改计算机名称电脑名如何改名
- 下一篇: 7-50 畅通工程之局部最小花费问题 (