A1039
-
题目大意:
- 给出c个课程代号,和每个课程对应的选课学生名字(4位char)。然后再给出k个学生名字,要求按照顺序输出每个学生的选课数和已选课程代号,课程代号升序表示。
-
注意点
- 学生名字对应选课代号可以用map<string,vector< Int> >,但本题数据量很大,不能用map,只能把学生名字转化成id,用hash存储。(对于本题来说,vector和map也只有这点差别)
- 注意字母转化成int时的算法:n=n*26+str[i]-‘A’.
-
代码
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
const int maxn = 26 * 26 * 26 * 10 + 10;
vector<int>Stu[maxn];
int changeToint(char name[])
{
int n = 0;
for(int i = 0; i < 3; i++)
n = n * 26 + name[i] - 'A';
n = n * 10 + name[3] - '0';
return n;
}
int main()
{
int N, K;
char name[5];
cin >> N >> K;
for(int i = 0; i < K; i++)
{
int course, s; //t:course s:student's count
scanf("%d%d", &course, &s);
for(int j = 0; j < s; j++)
{
scanf("%s", name);
int id = changeToint(name);
Stu[id].push_back(course);
}
}
for(int i = 0; i < N; i++)
{
scanf("%s", name);
printf("%s", name);
int id = changeToint(name);
printf(" %d", Stu[id].size());
sort(Stu[id].begin(), Stu[id].end());
for(int j = 0; j < Stu[id].size(); j++)
printf(" %d", Stu[id][j]);
printf("\n");
}
return 0;
}
A1047
-
题目大意
- 和上题相反,给出每个学生选的课,让你根据课程编号依次输出选这门课的学生名字,按字母序排列。
-
注意点
- 因为题目信息是按照学生名字给出的,则可以把学生设置成id号,另建char数组记录学生名字和id对应。
- 设置vector< int >course_stu [maxn] 数组,数组下标表示课程id,容器内部表示选当前这门课的学生id。
- 题目要求按照字母序排列,可以自定义cmp函数,交换容器内部元素的位次,而不改变id和name的对应规则。
-
代码
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
const int maxc = 2600;
const int maxs = 40010;
vector<int>courseStu[maxc];
char name[maxs][5];
bool cmp(int a, int b)
{
return strcmp(name[a], name[b]) < 0;
}
int main()
{
int N, K; //N:学生数 K:课程数
cin >> N >> K;
for(int i = 0; i < N; i++)
{
scanf("%s", name[i]); //把学生名字存到数组里
int c;
scanf("%d", &c);
for(int j = 0; j < c; j++)
{
int tc; //课程代号
scanf("%d", &tc);
courseStu[tc].push_back(i);
}
}
for(int i = 1; i <= K; i++)
{
printf("%d %d\n", i, courseStu[i].size());
sort(courseStu[i].begin(), courseStu[i].end(), cmp);
for(int j = 0; j < courseStu[i].size(); j++)
{
printf("%s", name[courseStu[i][j]]);
printf("\n");
}
}
return 0;
}