最近作者在刷pat,俗话说,学到能教人的程度才算完全掌握,教人等于输出,教的不对肯定是自己掌握不牢固,也就是内在算法不对。写这篇博客的目的一方面在于复习自己所学过的知识,整理下方便以后再次学习,作者水平很菜,欢迎大佬们纠正。
1.单独定义一个vector 数据类型 typename, vector名称 name;
vector<typename> name; //长度可变的一维动态数组当然作为一个容器(什么是容器,就像碗里面放水一样,vector是碗,typename是水,当然也可以放米饭什么的),数据类型就可以放int、double、char、结构体等等,甚至你可以放他本身——大碗里放了个小碗。。。
vector<vector<int> > name; //“>” “>”之间要加空格,为了和iostream中的>>流做区分这就成了一个两个维度都没定义的二维动态数组。灵魂画图,不喜见谅==。
vector<int> name[100];很多小伙伴看到过这种写法,这种写法意思是其中一维用定义好长度为100的vector数组,另一维为长度动态变化的vector数组,vector中存int类型的数据。
Zhejiang University has 40000 students and provides 2500 courses. Now given the student name lists of all the courses, you are supposed to output the registered course list for each student who comes for a query.
Input Specification Each input file contains one test case. For each case, the first line contains 2 positive integers: N (≤40,000), the number of students who look for their course lists, and K (≤2,500), the total number of courses. Then the student name lists are given for the courses (numbered from 1 to K) in the following format: for each course i, first the course index i and the number of registered students Ni (≤200) are given in a line. Then in the next line, Ni student names are given. A student name consists of 3 capital English letters plus a one-digit number. Finally the last line contains the N names of students who come for a query. All the names and numbers in a line are separated by a space.
Output Specification: For each test case, print your results in N lines. Each line corresponds to one student, in the following format: first print the student’s name, then the total number of registered courses of that student, and finally the indices of the courses in increasing order. The query results must be printed in the same order as input. All the data in a line must be separated by a space, with no extra space at the end of the line.
Sample Input: 11 5 4 7 BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1 1 4 ANN0 BOB5 JAY9 LOR6 2 7 ANN0 BOB5 FRA8 JAY9 JOE4 KAT3 LOR6 3 1 BOB5 5 9 AMY7 ANN0 BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1 ZOE1 ANN0 BOB5 JOE4 JAY9 FRA8 DON2 AMY7 KAT3 LOR6 NON9
Sample Output: 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 NON9 0
示例代码:
#include <cstdio> #include <vector> #include <cstring> #include <algorithm> using namespace std; int getID(char name[]) //字符串hash(另开章节,未完待续),目的在于将字符串转化为数字存储,英文字母为26进制,数字为10进制,统一转化为10进制存储 { int id = 0; for(int i =0; i< 3; i++) { id = id * 26 + (name[i] - 'A'); } id = id * 10 + (name[3] - '0'); return id; } const int N = 40010; //总人数 const int M = 26*26*26*10 + 1; //三位英文字母加一位数字加一 vector<int> selectCource[M]; int main() { char name[5]; int n, k; // 人数及课程数 scanf("%d %d", &n, &k); for(int i = 0; i < k; i++) //对每门课程 { int course, x; scanf("%d %d", &course, &x); for(int j = 0; j < x; j++) //对选这门课的每个人 { scanf("%s", name); int id = getID(name); selectCource[id].push_back(course); //将课程编码加入尾部 } } for(int i = 0; i < n; i++) //n个查询 { scanf("%s", name); int id = getID(name); sort(selectCource[id].begin(), selectCource[id].end());//将每个人课程编号按从小到大排序 printf("%s %d", name, selectCource[id].size()); // 姓名,选课数 for(int i = 0; i < selectCource[id].size(); i++) //依次输出所选课程 { printf(" %d", selectCource[id][i]); } printf("\n"); } return 0; }未完待续,敬请期待。
