本来这道题思路很简单(思路见代码注释),但由于设置了内存限制,暴力解会超时
//第一次提交超时
#include <cstdio> #include <cstring> #define MAX_STU 26 * 26 * 26 * 10 static struct cou_t { int nam[200]; int num; }cou[2500];//2500门课,一门课最多200人 static struct stu_t { int cou[2500];//course int num = 0; }stu[MAX_STU];//40000人,一个人最多2500门课 static struct seq_t { char nam[5]; int has;//hash value }seq[40000]; static int hash(char s[], int n) { int sum = 0; for (int i = 0; i < n - 1; ++i) sum = sum * 26 + (s[i] - 'A'); sum = sum * 10 + (s[n - 1] - '0'); return sum; } int main1() { int n, k; //1. INPUT scanf("%d%d", &n, &k); for (int i = 0; i < k; ++i) { int idx, num; scanf("%d%d", &idx, &num); cou[idx].num = num; for (int j = 0; j < num; ++j) {//这门课有多少人报名 char tmp[5]; scanf("%s", tmp); cou[idx].nam[j] = hash(tmp, 4);//idx每门课id,依次保存学生名字哈希值(相当于保存学生本人) } } for (int i = 0; i < n; ++i) { char tmp[5]; scanf("%s", tmp); strcpy(seq[i].nam, tmp); seq[i].has = hash(tmp, 4); } //2. EXECUTE: TO RECORD STU QUERY for (int i = 1; i <= k; ++i) {//遍历每门课 for (int j = 0; j < cou[i].num; ++j) { int stu_nam = cou[i].nam[j];//是哪个学生 stu[stu_nam].cou[stu[stu_nam].num++] = i;//stu_nam学生的第stu_cou门课是 i } } //3. OUTPUT for (int i = 0; i < n; ++i) { printf("%s %d ", seq[i].nam, stu[seq[i].has].num); int stu_nam = seq[i].has;//是哪个学生 for (int j = 0; j < stu[stu_nam].num; ++j) { printf("%d", stu[stu_nam].cou[j]); if (j != stu[stu_nam].num - 1) printf(" "); else printf("\n"); } } return 0; }
看解析需要用到 vector,我的C++又太辣鸡,花了很久才弄懂 vector 数组的几个区别,所以写个博客记录一下 :-| (详见:Difference between vector <int> V[] and vector< vector<int> > V)
主要涉及以下几种数组定义
const int m = 100; //1. int a1[m]; //2. vector<int> a2[m]; //3. vector<vector<int> > v3(m); //4. vector<vector<int> > v4;
1. 一维数组:里面每个元素只能是“一个” int 型值,如下图
2. 一维 vector 数组:里面每个元素是“一个” vector,而一个 vector 变量又相当于一个数组,即 a2[i] 是 vector 类型,可以一直调用 a2[i].push_back() ——看起来像一个二维数组 。如下图
3. 二维 vector 数组(带长度):和②用法相同,唯一不同是这种类型还能变长,即 v3.push_back(sub); //vector<int> sub; 。如下图
4. 二维 vector 数组(不带长度):和③相比,③刚定义出来就可以直接访问范围 m 内的元素如 v3[8]; v3[66]; 等等,而④必须先将访问元素前面所有元素一个个添加完之后才能用下标访问。值得一提的是,③和④都可以 v3.push_back(sub); //或 v4.push_back(sub); 扩展原来数组长度。如下图
基本上代码没什么要记录的了,把 C-Style 二维数组换成 vector 就可以了