本題考點:
- 排序的應用
假設全校有最多40000名學生和最多2500門課程。現給出每個學生的選課清單,要求輸出每門課的選課學生名單。
輸入格式:
輸入的第一行是兩個正整數:N(≤40000),爲全校學生總數;K(≤2500),爲總課程數。此後N行,每行包括一個學生姓名(3個大寫英文字母+1位數字)、一個正整數C(≤20)代表該生所選的課程門數、隨後是C個課程編號。簡單起見,課程從1到K編號。
這道題直接用 vector 存儲即可,但是注意,當數據量很大的時候,cin,cout
用來輸入輸出就不合適了,這個時候應該選擇 scanf,printf
來處理輸入輸出(真是超時解決的一個方法…)。
完整代碼實現如下:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#define LOCAL
using namespace std;
#define MAXN 2510
vector<string> lists[MAXN];
int main()
{
#ifdef LOCAL
freopen("data.txt", "r", stdin);
#endif
int N, K;
scanf("%d%d", &N, &K);
getchar();
string name;
char nameChar[5];
int cnt, classId;
for (int i = 0; i < N; i++)
{
scanf("%s", nameChar);
name = string(nameChar);
scanf("%d", &cnt);
while (cnt--)
{
scanf("%d", &classId);
lists[classId].push_back(name);
}
getchar();
}
int len;
for (int i = 1; i <= K; i++)
{
sort(lists[i].begin(), lists[i].end());
printf("%d %d\n", i, lists[i].size());
for (int j = 0; j < lists[i].size(); j++)
{ // 字符串轉爲 字符串數組
len = lists[i][j].copy(nameChar, lists[i][j].size());
printf("%s\n", nameChar);
}
}
return 0;
}