PAT (Advanced Level) Practice - 1039 Course List for Student(25 分)

简介: PAT (Advanced Level) Practice - 1039 Course List for Student(25 分)

题目链接:点击打开链接

题目大意:略。

解题思路:


  1. 原本是 map 改成 unordered_map 还是 TLE 了。
  2. 用 hash + sort 思想,AC。


TLE 代码

#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
struct cmp
{
    bool operator()(int a,int b)
    {
        return a>b;
    }
};
priority_queue<int,vector<int>,cmp> pq,tpq;
unordered_map<string,priority_queue<int,vector<int>,cmp>> mp;
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        mp.clear();
        int id,k;
        char name[7];
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&id,&k);
            for(int j=0;j<k;j++)
            {
                scanf("%s",name);
                mp[name].push(id);
            }
        }
        for(int i=0;i<n;i++)
        {
            scanf("%s",name);
            tpq=mp[name];
            printf("%s",name);
            printf(" %d",tpq.size());
            while(!tpq.empty())
            {
                printf(" %d",tpq.top());
                tpq.pop();
            }
            puts("");
        }
    }
    return 0;
}

AC 代码

#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
#define MAX 26*26*26*10
using namespace std;
typedef long long ll;
vector<int> v[MAX];
int fhash(char s[])
{
    return (s[0]-'A')*26*26*10 + (s[1]-'A')*26*10 + (s[2]-'A')*10 + (s[3]-'0');
}
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        int id,k;
        char name[7];
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&id,&k);
            for(int j=0;j<k;j++)
            {
                scanf("%s",name);
                v[fhash(name)].push_back(id);
            }
        }
        for(int i=0;i<n;i++)
        {
            scanf("%s",name);
            printf("%s",name);
            id=fhash(name);
            int len=v[id].size();
            printf(" %d",len);
            sort(v[id].begin(),v[id].end());
            for(int i=0;i<len;i++)
            {
                printf(" %d",v[id][i]);
            }
            puts("");
        }
    }
    return 0;
}
目录
相关文章
|
存储 C++
【PAT甲级 - C++题解】1047 Student List for Course
【PAT甲级 - C++题解】1047 Student List for Course
73 1
|
存储 C++
【PAT甲级 - C++题解】1039 Course List for Student
【PAT甲级 - C++题解】1039 Course List for Student
67 0
【1047】Student List for Course (25 分)
【1047】Student List for Course (25 分) 【1047】Student List for Course (25 分)
78 0
|
Java Scala Python
scala调用java的方法,返回了一个对象链表List<Student>,在scala中遍历该链表获取指定Student的名字name
假设Student类如下: class Student { private int no; private String name; public int getNo() { return no; } public String getName() { return n...
1563 0
|
5月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
953 1
|
4月前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
|
4月前
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
4月前
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
|
5月前
|
Java API
使用 Java 来实现两个 List 的差集操作
使用 Java 来实现两个 List 的差集操作
161 3
|
4月前
|
存储 Java 索引
Java List接口实现原理与性能评估
Java List接口实现原理与性能评估