PAT(甲级)2020年春季考试 7-4 Replacement Selection
这种复杂的模拟题,对于我这种菜鸡,只能是根据自己的理解,去把题目给演示出来,然后结合测试用例,一点一点debug+打印输出,的确耗时,所以考试要是遇到就放最后吧。
把这题做出来,我的一个收获是,学会了用优先队列对结构体进行排序。
本题我用一个结构体类型的priority_queue模拟那个关键的内存。对于每个结点,都有2个属性,数据和标签,标签代表这个结点属于哪一批被排序。也是最后输出的依据。
本题的关键点就在于,一个待进入的数字,可能不是这一批的,但是又一定会进入。所以结构体排序的依据就是先让批次小的浮上来,再让数值小的浮上来。
第一次得分是10/30。还遇到一个运行时错误,说明可能有越界访问,我加了一个队列的判空,于是那个用例变成了答案错误。
去看别人的代码,我受到启发,我以内存是否为空为主线程,后来因为读不全被迫加上判断是否所有的元素都进入了。为什么不换种思路,把读入全部数据作为主线程呢?担心内存最后还有元素剩余,再后补一个while循环即可。便有了第二次的AC程序。
也由此,我又得到一个宝贵经验,主线程的选择十分重要。别的可以修修补补。并列比嵌套容易处理。
第一次程序
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<set>
#include<vector>
#include<queue>using namespace std;const int maxn = 100010;//81, 94, 11, 96, 12, 99, 35
//[81 94 11] 96 12 99 35
//run1:11 [81 94 96] 12 99 35
//run1:11 81 run2:12 [94 96 12] 99 35
//run1:11 81 94 run2:12 [96 99 12] 35
//run1:11 81 94 96 run2:12 35 [35 99 12]
//run1:11 81 94 96 99 run2:12 35//13 3
//81 94 11 96 12 99 17 35 28 58 41 75 15
//run1:81 94 11 [81 94 11]
//run1:81 94 11 96 [81 94 96]
//run1:81 94 11 96 run2:12 [94 96]
//run1:81 94 11 96 99 run2:12 [99 96]
//run1:81 94 11 96 99 run2:12 17 [99]
//run1:81 94 11 96 99 run2:12 17 35 []
//run1:81 94 11 96 99 run2:12 17 35 [12 17 35]
//run1:81 94 11 96 99 run2:12 17 35 28[28 17 35]
//run1:81 94 11 96 99 run2:12 17 35 28 58[28 58 35]
//run1:81 94 11 96 99 run2:12 17 35 28 58 41[41 58 35]
//run1:81 94 11 96 99 run2:12 17 35 28 58 41 75[41 58 75]struct Node{int data;int label;friend bool operator < (Node a,Node b){if(a.label!=b.label)return a.label>b.label;else return a.data>b.data;} Node(int _data,int _label):data(_data),label(_label){}
};vector<Node> vi;//存放读入 priority_queue<int,vector<int>,greater<int> > run[maxn];//存放结果 priority_queue<Node> RS;//模拟内存空间 int main(){int n,L,label = 1;scanf("%d %d",&n,&L);for(int i=0;i<n;i++){int data;scanf("%d",&data);Node node = Node(0,0);if(i<L){node = Node(data,label);//前L个元素一定在第一轮RS.push(node);}else{node = Node(data,0); }vi.push_back(node); }int q = L;//vi[q] int left = 0;//剩余的存储空间 //test
// printf("初始:RS内存中的可进入空间为为%d\n",left);
// printf("RS内存中的已有元素为%d\n",RS.size());
// printf("\n");while(RS.size()!=0||q<n){Node node = RS.top();int data = node.data;int nLabel = node.label;run[nLabel].push(data);RS.pop();if(nLabel == label)left ++;if(left==0){label ++;printf("改朝换代了\n\n");continue; }//test
// printf("经过弹出:RS内存中的元素大小为%d\n",left);
// printf("RS内存中的已有元素为%d\n",RS.size());
// printf("\n");if(q<n){if(vi[q].data>=data){vi[q].label = label;RS.push(vi[q]);left --;}else{vi[q].label = label+1;RS.push(vi[q]);left --;}q++;}//test
// printf("经过放入:RS内存中的元素大小为%d\n",left);
// printf("RS内存中的已有元素为%d\n",RS.size());
// printf("\n");}for(int i=1;i<=label+1;i++){int size = run[i].size();int out = 0;while(!run[i].empty()){printf("%d",run[i].top());out++;if(out<size)printf(" ");else printf("\n");run[i].pop();}}return 0;
}
第一次结果
第二次程序(AC代码)
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<set>
#include<vector>
#include<queue>using namespace std;const int maxn = 100010;//81, 94, 11, 96, 12, 99, 35
//[81 94 11] 96 12 99 35
//run1:11 [81 94 96] 12 99 35
//run1:11 81 run2:12 [94 96 12] 99 35
//run1:11 81 94 run2:12 [96 99 12] 35
//run1:11 81 94 96 run2:12 35 [35 99 12]
//run1:11 81 94 96 99 run2:12 35//13 3
//81 94 11 96 12 99 17 35 28 58 41 75 15
//run1:81 94 11 [81 94 11]
//run1:81 94 11 96 [81 94 96]
//run1:81 94 11 96 run2:12 [94 96]
//run1:81 94 11 96 99 run2:12 [99 96]
//run1:81 94 11 96 99 run2:12 17 [99]
//run1:81 94 11 96 99 run2:12 17 35 []
//run1:81 94 11 96 99 run2:12 17 35 [12 17 35]
//run1:81 94 11 96 99 run2:12 17 35 28[28 17 35]
//run1:81 94 11 96 99 run2:12 17 35 28 58[28 58 35]
//run1:81 94 11 96 99 run2:12 17 35 28 58 41[41 58 35]
//run1:81 94 11 96 99 run2:12 17 35 28 58 41 75[41 58 75]struct Node{int data;int label;friend bool operator < (Node a,Node b){if(a.label!=b.label)return a.label>=b.label;else return a.data>=b.data;} Node(int _data,int _label):data(_data),label(_label){}
};vector<int> vi;//存放读入 priority_queue<int,vector<int>,greater<int> > run[maxn];//存放结果 priority_queue<Node> RS;//模拟内存空间 int main(){int n,L,label = 1;scanf("%d %d",&n,&L);for(int i=0;i<n;i++){int data;scanf("%d",&data);Node node = Node(0,0);if(i<L){node = Node(data,label);//前L个元素一定在第一轮RS.push(node);}else{node = Node(data,0); }vi.push_back(data); }int q;//vi[q] int dead = 0;//已死内存 for(q=L;q<n;q++){Node now = RS.top();int nData = now.data;int nLabel = now.label;run[nLabel].push(nData);RS.pop(); int cData = vi[q];if(cData>=nData){Node node = Node(cData,label);RS.push(node);}else{Node node = Node(cData,label+1);RS.push(node);dead ++;if(dead == L){label ++;//改朝换代了 dead = 0;//清零 } }}while(!RS.empty()){//还有没出内存的 Node now = RS.top();int nData = now.data;int nLabel = now.label;run[nLabel].push(nData);RS.pop(); } //检验成果的时候到了 int i = 1;while(run[i].size()>0){int size = run[i].size();int out = 0;while(!run[i].empty()){printf("%d",run[i].top());out++;if(out<size)printf(" ");else printf("\n");run[i].pop();}i ++;}return 0;
}
第二次结果
相关文章:

On/Off FlipSwitch 按钮
https://proto.io/freebies/onoff/转载于:https://www.cnblogs.com/ElvinLong/p/4253665.html

P1541 乌龟棋 题解(洛谷,动态规划递推)
题目:P1541 乌龟棋 感谢大神的题解(他的写的特别好) 写一下我对他的代码的理解吧(哎,蒟蒻就这能这样...) 代码: #include<bits/stdc.h> #define ll long long using namespace std; ll num[350100]; ll p[5]; ll f[41][41][41][41]; int main() {ios::sync_with_stdio(fa…

asp.net 操作excel的实现代码
http://www.cnblogs.com/fywh/archive/2010/01/25/1655864.html转载于:https://www.cnblogs.com/modernsky2003/archive/2010/02/26/1673925.html

PAT(甲级)2020年春季考试 7-2 The Judger
这道题在模拟过程类型题种算友好的,很平铺直叙,主要就是hash的应用。 有两个小点: 1. 怎样快速求两个未知大小的整数a和b的差值(>0) abs(a,b) 2. 如果某一轮有不止一个人淘汰,应该输出 Round #1: 3 is out. Round #1: 4 …

C++_volatile限定修饰符 Pair类型
Volatile限定修饰符 当一个对象的值可能会在编译器的控制或检测之外被改变时,例如一个被系统时间更改的变量,那么这个变量就应该声明成volatile。 其主要作用是提示编译器,该对象的值可能在编译器未检测到的情况下被改变。因此编译器执行的某…

FWFT FIFO读操作注意
FWFT:First Word Fall Through的缩写,好像是Xilinx的说法,Altera对应的概念是Show-ahead synchronous(SASO)。即数据在rdreq有效之前就有效了,rdreq作为一个应答(ACK)。 需要注意的是当rdreq连续时,容易多读一个数据…

iOS图像识别
iOS通过摄像头动态识别图像 前言: 目前的计算机图像识别,透过现象看本质,主要分为两大类: 基于规则运算的图像识别,例如颜色形状等模板匹配方法基于统计的图像识别。例如机器学习ML,神经网络等人工智能方法**区别&…

PAT(甲级)2019年冬季考试 7-4 Cartesian Tree
这道题利用的是最小堆和中序排序的属性:只要知道根节点,就能得出哪些属于左子树,哪些属于右子树。 开始我一直报段错误,经过筛查,发现是创建树的函数忘记写返回语句 return root. AC代码 #include<cstdio> #i…

C#操作excel(多种方法比较)
我们在做excel资料的时候,通常有以下方法。 一.导入导出excel常用方法: 1.用查询表的方式查询并show在数据集控件上。 代码 publicstaticstringstrCon "Provider Microsoft.Jet.OLEDB.4.0 ; Data Source C:\\08.xls;Extended PropertiesExcel 8.0&…

383. Ransom Note/691. Stickers to Spell Word-- String, Map, back tracking-- 未完待续
383 easy 题,就是建立字母的hash 表 看第一个String 是否能被第二个String 所构建 canConstruct("aa", "aab") -> true 统计 第二个参数中每个字母的频率,可以用一个int[256] 建立hashmap, 然后统计 第一个String 中字母出现的…

Centos 修改时间地区及NTP同步北京时间
在我们使用CentOS系统的时候,也许时区经常会出现问题,有时候改完之后还是会出错,下面我们就来学习一种方法来改变这个状况。如果没有安装,而你使用的是 CentOS系统 那使用命令 yum install ntp 然后:ntpdate us.pool.n…

PAT(甲级)2019年冬季考试 7-2 Block Reversing
这题是做过的,B1025,我还总结过,果然早晚复相逢,只改了一点点,见1025 反转链表。 点睛之笔是结构体数组的哈希,地址既做下标,又有实际含义,妙啊。 node[add].add add; 当时应该是…

题目1444:More is better
时间限制:3 秒 内存限制:100 兆 特殊判题:否 提交:1362 解决:640 题目描述:Mr Wang wants some boys to help him with a project. Because the project is rather complex, the more boys come, the bette…

COMP 0137 Machine Vision
COMP 0137作业代做、Python实验作业代写、代做Python语言程序作业、代写Machine Vision作业COMP 0137 Machine Vision: Homework #1Due 19th November 2018 at 23:55pmWorth 10% of your overall gradeSubmit online, through MoodleFor this homework, we’ll revisit the pra…

windows mobile shell API
SHSetNavBarText 设置NavBar 文本信息 SHDoneButton 设置右上角button为关闭,还是最小化。 SHFullScreen 全屏,显示隐藏taskbar 软键盘button 开始图标 SHInitDialog 实例化对话框 SHInitDialogFlags 设置dialog参数…

PAT(甲级)2019年秋季考试 7-3 Postfix Expression
只在编译原理学过一点后序表达式,我把这题当作普通的二叉树遍历,事实上也的确如此。我注意到“-”这个符号不一样,别的都是后序遍历,但是遇到这个负号/减号就变成了先序。 于是我对负号做特判,遇到值为负号就改后序为…

(翻译)LearnVSXNow! #6 - 创建我们第一个工具集 - 序幕
在前面的文章中,我们在向导的帮助下创建了一些小的VSPackages。在第五讲中我们整理了VSX的一些思路和概念,深入VSPackages 了解了packages如何工作以及服务的机制。在这篇文章中我们继续向前。 本文我们开始创建一个工具集来帮助我们创建容易编写和理解的代码。我计…

Spring事务管理的底层逻辑—源码解析
本文代码为spring 5.1.2spring是如何控制事务的提交和回滚 加上Transactional注解之后,Spring可以启到事务控制的功能了,再正式执行方法前它会做一些操作,我们来看看 首先进入CglibAopProxy.class的intercept方法或者JdkDynamicAopProxy.clas…

[codevs 1913] 数字梯形问题
[codevs 1913] 数字梯形问题 题解: 本题就是加强版的 [codevs 1033] 蚯蚓的游戏问题。分别针对三个规则建图、运行最小费用最大流。规则1:从梯形的顶至底的m条路径互不相交。分析:因为要互不相交,所以每个点只能走一次,…

PAT(甲级)2019年秋季考试 7-2 Merging Linked Lists
又是老朋友链表输出题,依然采用哈希静态存储,但是这题稍复杂的是,有两条链表,但是我们可以默认link1>link2,然后让link2上的节点接着link1后面编号,并且注意link2是倒序输出的。 输出时有几个关键点&am…

Flash/Flex学习笔记(4):如何打开网页及Get/Post数据
flash终究只是客户端技术,所以很多时候还是需要与服务端技术(比如asp,asp.net,jsp,php之类)进行数据交互的,下面的代码演示了如何在flash中打开网页,以及用GET/POST二种方式向服务端发送数据//按下按钮,打开网页 btnOpen.addEvent…

【Mood 19】DailyBuild 2月
2月1号 仿美团loading时小人奔跑动画 HTML5定稿了,为什么原生App世界将被颠覆? -----HTML5一改过去卡顿不兼容的毛病,在硬件升级以及苹果谷歌策略变化的背景下,让自己的优势相对于原生开发更加明显起来: 对开发者的“跨…

(二)spring cloud微服务分布式云架构 - 整合企业架构的技术点
spring cloud本身提供的组件就很多,但我们需要按照企业的业务模式来定制企业所需要的通用架构,那我们现在需要考虑使用哪些技术呢? 下面我针对于spring cloud微服务分布式云架构做了以下技术总结,希望可以帮助到大家: …

用拓扑排序检测有向图中是否有环
目录 算法主要步骤 代码 测试数据 提示:由于拓扑排序的检测方式不涉及到边权或点权,所以拓扑序列中的正环和负环都能够被检测出来。检测可达负环可以用Bellman-Ford或者SPFA。 算法主要步骤 1. 记录每个结点的入度,设置一个队列…

关于大型网站技术演进的思考(五)--存储的瓶颈(5)
上文里我遗留了两个问题,一个问题是数据库做了水平拆分以后,如果我们对主键的设计采取一种均匀分布的策略,那么它对于被水平拆分出的表后续的查询操作将有何种影响,第二个问题就是水平拆分的扩容问题。这两个问题在深入下去&#…

Project Chameleon Work In Progress 10
现在的进展是,UMDF驱动的DeviceIOControl和Read、Write已经都能使用了,并且FX2LP的EP6IN也正常工作,下面是工作中的测试代码截图: 转载于:https://www.cnblogs.com/skogkatt/archive/2010/03/13/4163356.html

maven项目中 把依赖的jar包一起打包
2019独角兽企业重金招聘Python工程师标准>>> Maven1-HelloWorld简单入门 使用Maven Assembly plugin将依赖打包进jar 1、pom.xml 配置文件: 在pom.xml配置文件中添加 <build> <plugins> <plugin> <artifactId>maven-assembly…

PAT(甲级)2019年春季考试 7-4 Structure of a Binary Tree
目录 整体思路 犯的错误 代码 整体思路 1.先根据后序和中序序列建树,老生常谈,记得返回root 2.对树进行BFS,在这个过程中用hash的方式记录下每个值对应的父节点、左孩子、右孩子的值,记录下深度(即层数),还有孩子…

vs2008 常用快捷键
编辑快捷键 CtrlB,T 切换书签开关 CtrlB,N 移动到下一书签 CtrlB,P 移动到上一书签 CtrlB,C 清除全部标签 CtrlI 渐进式搜索 CtrlShiftI反向渐进式搜索 F12 转到定义 AltF12 查找符号(列出所有查找结果) CtrlF 查找 CtrlH 替换 CtrlShi…

我理解的观察者模式
什么是观察者模式? 当对象间存在一对多关系时,比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式也叫做发布订阅模式。 观察者模式有什么好处? 观察者模式中,被观察者发生改变时,会自动通知所…