pat1039Course List for Student (25)

DFRobot MGC3130电容式手势传感器库深度解析 电容式近场感应(Electric Near Field Sensing)是一种非接触、抗干扰的三维空间感知技术,其原理基于人体介电特性对高频电场的扰动响应,具备低功耗、高鲁棒性与零物理接触等核心优势。该技术广泛应用于医疗人机交互、工业HMI、智能家电等对可靠性与环境适应性要求严苛的嵌入式场景。DFRobot_MGC3130库正是面向Microchip MGC3130芯片的工程化实现,封装了I²C驱动、ASU硬件加速调度及多层抽象API,支持手势识别、触控检测与接近唤醒等功能动态切换。结合电容式近场感应与嵌入 阅读详情

题意分析:

(1)给出每个课程的编号以及选课的人数和选课的学生的姓名,给出若干个同学的姓名,要求按照给出的顺序列出每个学生选定的课程数、课程编号(按照从小到大的顺序)

(2)题目意思很简单,在做的过程中,可能会有多种方案,相信大家大部分人前面几个案例都可以过,就是最后一个案例要么超时,要么内存超限。因为涉及到根据字符串来索引列表,并且对索引到的结果排序。根据此思路就会出现三种做法,每一次都会从算法效率的瓶颈入手,进行一次次改进,来演示如何规范地去解一道编程题的步骤。希望对大家有所启发。

使用容器map<string,vector<int> >mp;输出时,对索引的结果直接排序后输出

#include <iostream>
#include <vector>
#include <map>
#include <string.h>
#include <algorithm>
using namespace std;

map<string,vector<int> >mp;
int main()
{
    int N,K,index,num,i=0;
    string name;
    cin>>N>>K;
    while(i<K)
    {
        cin>>index>>num;
        int j=0;
        while(j<num)
        {
            cin>>name;
            mp[name].push_back(index);
            j++;
        }
        i++;
    }
    for(int i=0;i<N;i++)
    {
        cin>>name;
        cout<<name<<" "<<mp[name].size();
        sort(mp[name].begin(),mp[name].end());
        vector<int>::iterator it=mp[name].begin();
        for(;it!=mp[name].end();it++)cout<<" "<<(*it);
        cout<<endl;
    }
    return 0;
}
该算法会导致最后一个案例超时,我们很自然怀疑是因为排序限制了算法的效率。因此可以考虑如果要避免排序,可以考虑在输入时就让学生的选课表天然有序,这样输出学生的课程时,课程序号也就天然有序了,就必须先用map<int,vector<string>>mp将课程的信息保存后,再按照课程序号依次输入

#include <iostream>
#include <vector>
#include <map>
#include <string.h>
using namespace std;

map<string,vector<int> >mp;
map<int,vector<string> >course;
int main()
{
    int N,K,index,num,i=0;
    string name;
    cin>>N>>K;
    while(i<K)
    {
        cin>>index>>num;
        int j=0;
        while(j<num)
        {
            cin>>name;
            course[index].push_back(name);
            j++;
        }
        i++;
    }
    for(int i=1;i<=K;i++)
    {
        vector<string>::iterator ite=course[i].begin();
        for(;ite!=course[i].end();ite++)
        {
            mp[*ite].push_back(i);
        }
    }
    for(int i=0;i<N;i++)
    {
        cin>>name;
        cout<<name<<" "<<mp[name].size();
        vector<int>::iterator it=mp[name].begin();
        for(;it!=mp[name].end();it++)cout<<" "<<(*it);
        cout<<endl;
    }
    return 0;
}
很遗憾,这次依然是超时,我们分析原因,可能还是因为我们做了一次课程信息的转存限制了算法效率,看来,此路行不通,能否不通过转存课程信息,而通过改进对学生课程序号排序呢,于是我们想到了位图排序。直接使用bool course[2501]来标识学生选了哪些课程,这样以牺牲空间来提高时间。

#include <iostream>
#include <vector>
#include <map>
#include <string.h>
using namespace std;

struct stu
{
    bool course[2501];
    int total;
};
map<string, stu>mp;
int main()
{
    int N,K,index,num,i=0;
    string name;
    cin>>N>>K;
    while(i<K)
    {
        cin>>index>>num;
        int j=0;
        while(j<num)
        {
            cin>>name;
            mp[name].course[index]=1;
            mp[name].total++;
            j++;
        }
        i++;
    }
    for(int i=0;i<N;i++)
    {
        cin>>name;
        cout<<name<<" "<<mp[name].total;
        for(int j=1;j<=K;j++)
        {
            if(mp[name].course[j])cout<<" "<<j;
        }
        cout<<endl;
    }
    return 0;
}

然而,上天并没有眷顾我们,牺牲空间的代价就是最后一个案例超出内存限制了。看来此时,我们已经无计可施。只能痛苦地再去看看题目了,等等!学生的名字好奇特,三个大写字母加一个数字,很固定的格式。这么巧合,看来这样的安排并不是空穴来风,否则随便给一个名字字符串不就好了,这可能就是给我在处理索引的时候提供了某些线索。此时我们再细想,我们一直青睐的map容器对字符串的索引其实也是效率不高的,不如直接使用位图索引效率高。由此我们推测:对字符串的索引限制了算法的效率。要改进索引策略,就只能对姓名进行编码了。最简单的编码就是将其按照“N进制”转换了。很显然这里的前三位进制为26,后一位为十。除了这点,其他的不变

#include <iostream>
#include <vector>
#include <map>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;

const int num=26*26*26*10+1;
vector<int>stu[num];

int hashName(string name)
{
    int len=name.length();
    int res=0;
    for(int i=0;i<len-1;i++)
    {
        res=res*26+name[i]-'A';
    }
    res=res*10+name[3]-'0';
    return res;
}
int main()
{
    int N,K,index,num,hname,i=0;
    char name[5];
    cin>>N>>K;
    while(i<K)
    {
        cin>>index>>num;
        int j=0;
        while(j<num)
        {
            cin>>name;
            hname=hashName(name);
            stu[hname].push_back(index);
            j++;
        }
        i++;
    }
    for(int i=0;i<N;i++)
    {
        cin>>name;
        hname=hashName(name);
        cout<<name<<" "<<stu[hname].size();
        sort(stu[hname].begin(),stu[hname].end());
        vector<int>::iterator itb=stu[hname].begin();
        vector<int>::iterator ite=stu[hname].end();
        for(;itb!=ite;itb++)cout<<" "<<*itb;
        cout<<endl;
    }
    return 0;
}
到此,如果你是惯用C语言的小伙伴,那么恭喜你,你已经成功AC了。如果是C++的小伙伴,那么对不起,上天仍然没有眷顾你,最后一个案例仍然超时。Why?难道同一套语言写出来的算法会有这么大效率诧异?

当然是!!!何况C++是基于C的升级版也不例外。这里要说到C语言中的标准输入输出scanf、printf和C++中标准输入输出流cin、cout其实在效率上来讲,scanf比cin的效率高出近10倍之多,有些输入数据量比较大的情况下,使用cin还没等输入完已经超时了。这是由于C++对标准输入做了封装,这里面的解释是:

(1)默认情况,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输 出顺序错乱。正因为这个兼容性的特性,导致cin有许多额外的开销,如何禁用这个特性呢?只需一个语句 std::ios::sync_with_stdio(false);,这样就可以取消cin于stdin的同步了,此时的cin就与scanf差不多了。

(2)另一种解释: cout在输出时总是要先将输出的存入缓存区。而printf直接调用系统进行IO,它是非缓存的。所以cout比printf慢。

终于我们搞明白了原因。再次改一下程序,此外,为了优化程序,将输出循环体中的stu[hname].end()直接拿到外面去,这样就不用每次判断都要算一遍。

参考:http://blog.youkuaiyun.com/iaccepted/article/details/39273311

可能坑点:

(1)使用了map索引

(2)使用了cin和cout输入输出

(3)没有考虑对名字的编码或者编码错误会导致不同的名字编码后冲突

(4)对学生的所选课课程开辟了过大数组[2501]

#include <iostream>
#include <vector>
#include <map>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;

const int num=26*26*26*10+1;
vector<int>stu[num];

int hashName(string name)
{
    int len=name.length();
    int res=0;
    for(int i=0;i<len-1;i++)
    {
        res=res*26+name[i]-'A';
    }
    res=res*10+name[3]-'0';
    return res;
}
int main()
{
    int N,K,index,num,hname,i=0;
    char name[5];
    scanf("%d %d",&N,&K);
    while(i<K)
    {
        scanf("%d %d",&index,&num);
        int j=0;
        while(j<num)
        {
            scanf("%s",name);
            hname=hashName(name);
            stu[hname].push_back(index);
            j++;
        }
        i++;
    }
    for(int i=0;i<N;i++)
    {
        scanf("%s",name);
        hname=hashName(name);
        printf("%s %d",name,stu[hname].size());
        sort(stu[hname].begin(),stu[hname].end());
        vector<int>::iterator itb=stu[hname].begin();
        vector<int>::iterator ite=stu[hname].end();
        for(;itb!=ite;itb++)printf(" %d",*itb);
        printf("\n");
    }
    return 0;
}



QMT Python API 实战指南:从安装到策略开发的完整流程 本文提供了一份详尽的QMT Python API实战指南,涵盖从环境配置到策略开发的完整流程。文章深入解析了xtdata行情模块与xttrader交易模块的核心架构与协作方式,并通过一个双均线策略实例,手把手教你如何获取数据、计算信号并执行交易,是量化交易开发者快速上手QMT Python接口文档的实用教程。 阅读详情

相关推荐

阿里云搭建vps服务器的过程

最近突发奇想想要搭建一个阿里云的的vps服务器,下面是搭建的过程: 首先,登录阿里云网站: 搜索,esc控制台: 点击创建实例: 选择地区: 选择实例规格: 选择镜像: 将存储规格改成100G(40G可能不够用) 点击下一步: 这里面不需要更改,点击下一步 设置连接密码即可 创建成功后点击启动 点击远程连接,然后立即登录,在弹出的框里面输入之前设置的密码即可 登录成功:

zhanchulan的博客 3373

PAT 1039 Course List for Student (25 分)

1039 Course List for Student (25 分) 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 cou...

peanWang的博客 517

光通信仿真入门:手把手教你用VPI和Matlab搭建第一个联合仿真系统(含避坑指南)

本文详细介绍了如何使用VPI和Matlab搭建光通信联合仿真系统,涵盖软件配置、链路搭建、数据交互等关键环节,并提供常见问题的解决方案。特别适合初学者快速掌握光通信仿真技术,避免常见错误,提升仿真效率。

weixin_28733637的博客 378

PAT甲级 1039 Course List for Student (25分)

1039 Course List for Student (25分) 题目链接:PAT A 1039 题目大意:输入第一行给出两个数n和k,分别代表需要查询的学生人数和一共有多少门课(课程编号从1到k)。之后对于每一门课,给出选课人数和选课的学生姓名。最后一行给出n个学生的姓名,要求根据姓名查找这个学生选了哪些课,输出选课门数和课程编号。 思路分析:一开始以为是非常简单的一道STL容器题,即应...

weixin_43684054的博客 328

HFSS 3D Layout一键导入PCB,高效搞定微带线损耗仿真

在高速PCB设计中,信号完整性与电磁仿真是确保链路质量的关键环节。传统的HFSS手动建模流程繁琐且极易出错,尤其面对微带线、带状线等高频结构时,叠层参数、铜箔粗糙度等细节难以精准还原,导致仿真结果与实测偏差较大。HFSS 3D Layout模块提供了从EDA工具直接导入PCB文件的能力,完整保留走线、过孔、叠层及材料属性,结合精确的介质损耗模型与端口设置,大幅缩短建模时间并提升仿真精度。该技术广泛应用于DDR、SerDes等高速数字链路的设计验证,以及SI/PI工程师对PCB损耗性能的快速评估。本文从导入操

weixin_29191081的博客 255

PLC与变频器联动控制:从开关量、模拟量到通讯的接线与编程实战

在工业自动化系统中,电机调速控制是核心需求之一,其关键在于实现可编程逻辑控制器(PLC)与变频器之间的可靠联动。其基本原理是通过PLC输出控制信号,由变频器接收并驱动电机按设定速度运行。这项技术的核心价值在于实现电机的软启停、精确调速与节能控制,广泛应用于风机、水泵、传送带及精密张力控制等场景。其中,开关量控制以其接线简单、抗干扰能力强的特点,成为基础且可靠的方案;而模拟量控制则能实现无级平滑调速,满足更高精度的工艺要求。本文以西门子、三菱等主流品牌为例,深入解析了这两种主流控制方式的硬件接线、参数设置与梯

1269

【PAT1039】 Course List for Student (25) Hash表

1039. Course List for Student (25) 时间限制 200 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Zhejiang University has 40000 stud

天堂人间 2216

[Godot][入门] 安装与版本选择:3.x 还是 4.x?(按项目类型一键决策)

摘要: Godot引擎版本选择需根据项目需求权衡3.x与4.x。Godot4.x(如4.2)适合3D开发和新项目,支持Vulkan和GDScript2.0,但生态尚不成熟;Godot3.x(如3.5.3)则更适合稳定2D开发、Web导出及依赖现有插件/教程的场景。安装方式极简,官网下载解压即可运行。新手建议:短期高效选3.x,长期探索选4.x,旧项目勿盲目迁移。附版本对比表及决策树,助开发者快速匹配需求。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 910

【PAT甲级】1039 Course List for Student (25分)

解题过程的小记录,如有错误欢迎指出。 难度:一星(在做完1012后弄懂排序规则后此题并不难) 小导航~题目分析注意点我的解题过程思路bug代码dalao的代码借鉴点 题目分析 注意点 我的解题过程 思路 bug 代码 dalao的代码 全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~ 借鉴点 ...

SpicyChicken的自我修养 379

使用Qt Creator自带的Qt Designer构造UI界面流程总结

在本文中,我们将总结使用Qt Creator自带的Qt Designer构造UI界面的流程。在对话框中,您可以选择一个控件的信号,然后将其连接到另一个控件的槽。例如,您可以将按钮的点击信号连接到一个槽函数,以响应按钮的点击事件。右键单击窗口设计器中的空白区域,选择适当的布局管理器,如水平布局、垂直布局或网格布局。在Qt Designer中,您可以使用各种预定义的UI控件来设计应用程序的界面。现在,您可以在应用程序的源代码中使用生成的UI界面。在您的源文件中,包含相应的头文件,然后创建一个UI界面的实例。

cl6789的博客 1393

边缘AI工业落地:YOLO26-Seg + RK3588 NPU 极致部署(低功耗+实时实例分割,工业场景全覆盖)

本次实战汇总了「YOLO26-Seg+RK3588 NPU」工业边缘部署中最常见、最致命的8个坑点,所有坑点均来自真实工业项目,解决方案均为零代码/一键操作,无需复杂配置,能让你少走90%的弯路,节省大量时间,必看必记!❌ RKNN转换报错「算子不支持/模型加载失败」→ ✅ 导出ONNX时必须指定opset=12,重新导出即可,RK3588唯一兼容版本;❌ 分割mask错位/轮廓模糊 → ✅ 导出ONNX时加,并保证RKNN的归一化参数与YOLO26一致,零代码修复;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1717

PAT A1039 Course List for Student (25 分)

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 ...

weixin_44620697的博客 186

cesium vue2/vue3教程目录导航

以下是本专栏目录导航,送完整项目源码(拒绝单页源码),可以直接运行,全部配置免费视频教程(B站)。

qq_29384639的博客 4317

PAT A1039 Course List for Student (25分)

1039 Course List for Student (25分) 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 Sp

weixin_45964844的博客 184

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

PAT A 甲级 1039 Course List for Student (25分)

1039 Course List for Student (25分) 吐槽 PAT编程常识:所有运行时间紧张的题目都要多提交几次碰碰随机数据的运气。 思路 显然这道题最大问题的就是运行时间非常紧张。最大2500*200条数据要对应到40000个人上,这是无论如何改进都不可能逃脱的操作,使用遍历去完成这件事(不管是在输入时还是中间处理还是输出时)明显是会超时的。 也就是说——只能在存储方式上下功夫,...

虚境的博客 287

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

1039. Course List for Student (25)-PAT甲级真题

1039. Course List for Student (25) 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

柳婼 の blog 2322

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

PAT_A 1039. Course List for Student (25)

PAT_A 1039. Course List for Student (25) map和hash法,map法会超时

longtails的博客 631

PAT A1039. Course List for Student (25)字符串hash

原文链接: PAT A1039. Course List for Student (25)字符串hash ...

阿豪 125

浙大pat1039 Course List for Student(25 分)

1039Course List for Student(25分) 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 reg...

dijiang0473的博客 203

1039. Course List for Student (25)-PAT

1039. Course List for Student (25) 时间限制 200 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Zhejiang University has 40000 stud

兵临城下 964

PAT 1039 Course List for Student (25分)

题目: 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 co...

qq_42593220的博客 168

PAT 1039. Course List for Student (25)

题目逻辑比较清晰,但是要解决超时问题

xunathan的专栏 659

PAT甲级-1039 Course List for Student (25分)

点击链接PAT甲级-AC全解汇总 题目: 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 ea...

卷子的博客 257

PAT甲级1039 Course List for Student (25 分)

1039Course List for Student(25分) 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 co...

Dexter 212

【PAT】1039. Course List for Student (25)

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

此去经年 381
上一篇: pat1038Recover the Smallest Number (30)
下一篇: pat1040Longest Symmetric String (25)
LostStephon
博客等级 码龄11年 14粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值