PAT A1039 Course List for Student (25)--vector的使用

本文深入探讨了C++中vector和hash表的高效使用技巧,特别是在处理大规模数据集和复杂算法竞赛题目时的优势。通过具体实例,展示了如何利用vector的灵活性和hash表的快速查找特性,显著提升代码性能和执行效率。

1.总结:vector真的贼好用,不仅可以根据输入数据设置大小,节省空间,而且可以一维,二维,多维各种数据类型的组合。

2.cin,cout这种题肯定会超时,以后注意用char*,scanf和printf

3.参考代码用的很巧秒,因为name只有三个字母,可以映射到hash表中(占用数组空间也不大),大大提升了效率

4.还是先想思路,在写代码才会下笔如有神!!!

代码(最后一个点超时):

#include<iostream>
#include<vector>
#include<string>
#include<unordered_map>
#include<algorithm>
using namespace std;
int n;        //学生数
int k;      //课程
struct node{
    int num;
    string name;
    int course[1100];
    node()
    {
        num = 0;
    }
};
unordered_map<string, node> gg;
int sizz[2511];
string sss[11000]; int g = 0;
int main()
{

    cin >> n >> k;
    vector<vector<string> > pp(k+4,vector<string>(255));
    for (int i = 1; i <= k; i++)
    {
        int index, size;
        scanf("%d%d", &index, &size); sizz[index]=size;
        for (int j = 1; j <= size; j++)
        {
            cin >> pp[index][j];
        }
    }
    for (int i = 0; i < n; i++)
    {
        pair<string,node> s;
        cin >> s.first; sss[g++] = s.first;
        gg.insert(s);
    }
    for (int i = 1; i <= k; i++)
    {
        for (int j = 1; j <= sizz[i]; j++)
        {
            gg[pp[i][j]].course[gg[pp[i][j]].num++] = i;
        }
    }
    for (int i = 0; i < g;i++)
    {
        cout << sss[i];
        printf(" %d", gg[sss[i]].num); if (gg[sss[i]].num != 0)printf(" ");
        for (int j = 0; j < gg[sss[i]].num; j++)
        {
            printf("%d",gg[sss[i]].course[j]);
            if (j!= gg[sss[i]].num - 1)printf(" ");
        }
        if(i!=g-1)printf("\n");
    }
    return 0;
}

参考代码:

#include <cstdio>

#include <vector>

#include <algorithm>

using namespace std;

int getid(char *name) {

    int id = 0;

    for(int i = 0; i < 3; i++)

        id = 26 * id + (name[i] - 'A');

    id = id * 10 + (name[3] - '0');

    return id;

}

const int maxn = 26 * 26 * 26 * 10 + 10;

vector<int> v[maxn];

 

int main() {

    int n, k, no, num, id = 0;

    char name[5];

    scanf("%d %d", &n, &k);

    for(int i = 0; i < k; i++) {

        scanf("%d %d", &no, &num);

        for(int j = 0; j < num; j++) {

            scanf("%s", name);

            id = getid(name);

            v[id].push_back(no);

        }

    }

    for(int i = 0; i < n; i++) {

        scanf("%s", name);

        id = getid(name);

        sort(v[id].begin(), v[id].end());

        printf("%s %lu", name, v[id].size());

        for(int j = 0; j < v[id].size(); j++)

            printf(" %d", v[id][j]);

        printf("\n");

    }

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要绝望总会慢慢变强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值