zoukankan      html  css  js  c++  java
  • A1039 Course List for Student (25分)

    本来这道题思路很简单(思路见代码注释),但由于设置了内存限制,暴力解会超时

    //第一次提交超时
    #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 就可以了

    代码地址

     
  • 相关阅读:
    Java 进制转换
    k-近邻算法实例
    Java JTS & 空间数据模型
    Java中 &&与&,||与|的区别
    http https 区别
    四种DCOM错误的区别,0x80080005 0x800706be 0x80010105 0x
    OPC测试常用的OPCClient和OPCServer软件推荐
    关于TFS2010 远程无法创建团队项目的若干问题总结
    我对NHibernate的感受(4):令人欣喜的Interceptor机制
    我对NHibernate的感受(3):有些尴尬的集合支持
  • 原文地址:https://www.cnblogs.com/bEngi1/p/14322728.html
Copyright © 2011-2022 走看看