浙大2013年机试题解(pat 1054-1057)

本文解析了四道编程题:1054ThedominantColor利用map解决;1055TheWorld'sRichest使用vector和优先队列处理大规模数据;1056miceandrice通过list实现循环操作;1057Stack借助树状数组和二分法求解中间值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



1054 The dominant Color

没什么好说的,map之~

注意题里说严格多数是一定存在的



1055 The World's Richest

这道题目的测试点2数据量较大,易超时

做法是

每条数据编为node

放入vector的数组(以age(0, 200]为下标)

按worth-name排序

这里不用set存储是因为vector可以用下标操作,比较好处理

再用优先队列做M次循环

优先队列按worth-age-name排序

每次出队一个node就入队一个相同age的node(如果有的话)

用一个辅助数组记录这是该age的第几个node即可

这样可以保证最后的输出是按worth-age-name排序的

如果把所有符合age的node筛选出来做排序再输出会超时



1056 mice and rice

这道题目真正的困难在于读懂题意,表述得很不清楚,又是英文的

注意区分编程者的编号和编程的出场顺序,别绕晕了

可以用list进行操作,写一个函数在循环体中操作,当一次操作中一个loser都没有产生的时候跳出循环

最后转化为序号依次输出即可



1057 Stack

普通的栈操作用STL的stack

求中间那个数可以用树状数组

由于可能有重复的数,就用数组A存放大小为数组下标的数的个数做++和--操作,对应push和pop

此时问题转化为求其前缀和是总的前缀和的一半的数

用二分法即可求解

答案是满足sum(mid-1)<sumall&&sum(mid)>=sumall的mid



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值