<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[cgsdfc的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/cgsdfc</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cgsdfc]]></copyright><item><title><![CDATA[2021-03-23]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/115139510</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/115139510</guid><author>cgsdfc</author><pubDate>Tue, 23 Mar 2021 20:39:13 +0800</pubDate><description><![CDATA[CCF-CSP 字符画
这题只得了80分，还没有搞明白哪里出问题。这题思路其实很清晰的，先把输入的矩阵的元素解析成RGB三元组并以二维数组保存起来，然后按照要求，分块求平均值，注意这里的平均值是三种颜色各自的平均值。求出平均值后存到一个新的二维数组。然后按照给定的规则来绘制，具体规则我这里就不展开了，对每一个像素（即RGB三元组）输出一个空格，并且可能带有变色控制指令。注意题目提到了前景色和背景色，但是其实用到的只有背景色。
对于最后输出为字符的16进制格式的处理上，我取了个巧：先按照字符串的形式保存起来，]]></description><category></category></item><item><title><![CDATA[2021-03-19]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/114998806</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/114998806</guid><author>cgsdfc</author><pubDate>Fri, 19 Mar 2021 10:00:51 +0800</pubDate><description><![CDATA[CCF-CSP Markdown
CCF考Markdown的题目好像不是第一次了，而且HTML相关的也考过。这题把Markdown语法和HTML输出结合起来，要求解析Markdown语法（部分），然后转换为HTML输出。分为区块和行内两种语法，其中区块是空行分隔的，所以就很好处理了，因为一个区块内没有空行，并且相邻区块之间必定有空行，所以处理一个区块时，读取连续的非空行即可。当然保险起见，如果区块的行有某些特征，比如列表的行以星号开头，那么可以读取连续的有特征的行。
于是程序主体分为两层，外层枚举所有区块，]]></description><category></category></item><item><title><![CDATA[2021-03-18]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/114992228</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/114992228</guid><author>cgsdfc</author><pubDate>Thu, 18 Mar 2021 22:12:23 +0800</pubDate><description><![CDATA[CCF-CSP Crontab
非常坑的一题，可能是因为我菜吧。
考的的东西很多，把几种模拟题都揉在一起了，比如：

日期处理，包括枚举分钟，计算某天是星期几，后者可以枚举天，也有公式，但是我记不住，哈哈。
字符串解析，这个不用说了，大模拟必考。
解析后建立满足题目意思的数据结构。

思路：首先注意日期的表示法，我用的是年月日时分表示法，而不是弄成一个整数，实际上我只会这一种表示法，并且在算法笔记上学过练过。然后把控制表（即Crontab）输入，解析，建立可以方便的查询的数据结构。还是老办法，用enum标记]]></description><category></category></item><item><title><![CDATA[2021-03-18]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/114987147</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/114987147</guid><author>cgsdfc</author><pubDate>Thu, 18 Mar 2021 18:20:47 +0800</pubDate><description><![CDATA[CCF-CSP 化学方程式
提醒：下面的代码在Dev(C++)模式下编译出错，但是我真的看不出来哪里不对，并且本地用同样的标准编译没问题；而用PAT的OJ编译也是没问题的。所以我用CCF的C++11模式去提交，就100了。很奇怪吧？如果有热心人看出了我哪里有问题，欢迎评论告诉我，谢谢！
思路：是CCF的一贯风格：字符串解析。这题我感觉比JSON查询的难度大，因为这题要找出用栈保存什么还是挺难的。虽然出栈和入栈时机很明显，就是碰到左右括号嘛。最后发现原来需要用栈保存当前列表的化学元素的计数（用一个map表示）]]></description><category></category></item><item><title><![CDATA[2021-03-18]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/114982665</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/114982665</guid><author>cgsdfc</author><pubDate>Thu, 18 Mar 2021 16:14:18 +0800</pubDate><description><![CDATA[CCF-CSP JSON解析
基本思路是用栈解决嵌套对象问题。注意在解析中维护好不变式。这里我用了一种简化的思路：把一个对象看做是一些键值对的序列，然后套用一个经典的解析循环：先跳过分隔符直到找到键值对的开头，然后解析这个键值对，如此循环直到到达字符串结束，或者遇到结束符号。在这里要注意几点：

解析键值对时，遇到值为OBJ的，要把当前对象入栈，并令当前对象指向新生成的对象。
当遇到对象结束符号，即}时，要把栈顶对象出栈，并把当前对象指向它。如果不存在栈顶对象，说明最顶层对象的解析结束了，应该返回。
还有注]]></description><category></category></item><item><title><![CDATA[2021-03-18]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/114972362</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/114972362</guid><author>cgsdfc</author><pubDate>Thu, 18 Mar 2021 12:21:06 +0800</pubDate><description><![CDATA[CCF-CSP URL映射
把题目的意思先搞懂。就是给你一些URL规则和一些URL，然后对每个URL，按照先后顺序逐个匹配所有URL规则，按照第一个匹配就匹配的原则。匹配成功则输出规则的名字和所有的参数（就是把参数的值从URL里抠出来）；匹配失败则输出404 。
注意处理结尾的斜杠。因为保证以斜杠开头（规则或者ULR都是如此），所以把URL抽象为片段的序列，每个片段前面必有一个斜杠，只需记录整个串是否以斜杠结尾即可。注意题目的规定，如果最后一个片段是path，则不能以斜杠结尾。
最后注意一下规则可能没有片段]]></description><category></category></item><item><title><![CDATA[2021-02-27]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/114165229</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/114165229</guid><author>cgsdfc</author><pubDate>Sat, 27 Feb 2021 10:58:23 +0800</pubDate><description><![CDATA[CCF-CSP\专题\题型A 简单模拟\201703-2 学生排队
这题考察顺序表的查找和插入操作，基本上就是找到一个元素然后把它插入到前面或者后面的位置，然后保持其他元素的相对位置不变。
#include &lt;cstdio&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt; // find

using namespace std;
 
/* run this program using the console pauser or add yo]]></description><category></category></item><item><title><![CDATA[2021-02-27]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/114164335</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/114164335</guid><author>cgsdfc</author><pubDate>Sat, 27 Feb 2021 10:39:22 +0800</pubDate><description><![CDATA[CCF-CSP\专题\题型A 简单模拟\201709-2 公共钥匙盒
这道题难点是怎么处理归还和接走钥匙的逻辑，以及怎么处理时间。其实这里的时间（包括其他CCF的时间）都是离散的，就是可列的，于是用一个数组保存所有的操作，再按照要求去排序，然后按照顺序去模拟即可。排序是个好东西。
#include &lt;cstdio&gt;
#include &lt;algorithm&gt;
using namespace std;

/* run this program using the console paus]]></description><category></category></item><item><title><![CDATA[2021-02-26]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/114150899</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/114150899</guid><author>cgsdfc</author><pubDate>Fri, 26 Feb 2021 20:09:30 +0800</pubDate><description><![CDATA[CCF-CSP\专题\题型A 简单模拟\201903-2 二十四点
简单的中缀表达式计算，无括号，数字是0-9的数字，加减乘除四则运算。
注意不需要先转后缀再计算，直接遍历（带栈）就可以计算了。
#include &lt;cstdio&gt;
#include &lt;stack&gt;
using namespace std;

int N;

const int Len=7;

int Ord(char c) {
	switch (c) {
		case '-':
		case '+':
			retu]]></description><category></category></item><item><title><![CDATA[2021-02-26]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/114150470</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/114150470</guid><author>cgsdfc</author><pubDate>Fri, 26 Feb 2021 20:06:28 +0800</pubDate><description><![CDATA[CCF-CSP\专题\题型A 简单模拟\201612-2 工资计算
算是比较复杂的简单模拟了，主要难点在于税后工资的计算，因为情况太多，开了一个数组保存税率和下界，然后注意枚举每个税率不同的区间（当然是按税率从低到高枚举），如果当前区间的上界小于等于税前工资A，就扣除当前区间对应的税，否则退出循环，把逻辑搞清楚就行。
然后坑点还有保证税前工资是整百。如果用线性查找（也能过，真的！），就每次递增100，如果用二分查找，就注意要对整百进行查找，即用1代表100,2代表200等等，否则当二分除以二的时候，就会有问]]></description><category></category></item><item><title><![CDATA[2021-02-20]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/113884623</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/113884623</guid><author>cgsdfc</author><pubDate>Sat, 20 Feb 2021 15:40:29 +0800</pubDate><description><![CDATA[北航机试 2017 查找家族成员

输入若干行（总行数不超过），每一行的第一个输入为家谱中的某成员，该行接着输入的信息为该成员两个孩子的姓名（保证除第一行的第一个成员外，每行第一个成员都在之前输入过）。
输入完毕后，最后一行输入两个成员（保证已输入过），为要求查找的两个家谱成员的关系，输出内容包括他们最近邻的共同祖先的名字以及在家谱中相差的层次数。
测试用例1：
输入：
Ye Shu Ba
Shu Ge Mei1
Ba Self Mei2
Ge Son1 Son2
Son2 Mei1
输出：
Shu 1

]]></description><category></category></item><item><title><![CDATA[2021-02-20]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/113879224</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/113879224</guid><author>cgsdfc</author><pubDate>Sat, 20 Feb 2021 11:17:32 +0800</pubDate><description><![CDATA[北航机试 2019 机场送旅客

先输入n（n &lt; 10000），代表有n组数据，接下来n行每行输入四个数，第一个输入为分支节点，后三个输入为其三个孩子节点（-1代表子节点不存在）。输入的n行中第一行第一个节点为根节点，作为起点。保证输入的结点至多有一个父节点。
然后输入m（m &lt; n），接下来输入m个客户，每行输入他的目标（叶节点）和优先级（数字越小越优先，保证不会有相同优先级），要求从起点出发，按照优先级把客户送到目标节点，然后从该节点继续运送下一个客户至其目标（叶节点），全部运送完毕后返回]]></description><category></category></item><item><title><![CDATA[2021-02-20]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/113878633</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/113878633</guid><author>cgsdfc</author><pubDate>Sat, 20 Feb 2021 11:05:24 +0800</pubDate><description><![CDATA[北航机试 2019 网络打印机

一个网络中有三种设备：交换机、电脑和打印机，网络成树状，电脑和打印机只在叶子节点上。交换机有4个端口。
首先输入一个数N表示设备的个数。
然后按照id，类型，父节点id，端口号依次输入每台设备
最后输入一个id（电脑），找距离这台电脑最近的打印机，如果有多个则按照前序遍历的顺序找到打印机
输出这台打印机的编号和从电脑到这台打印机的路径。
输入：
当前网络中设备数m
&lt;设备ID&gt;&lt;设备类型&gt;&lt;设备父节点ID&gt;&lt;端口号&gt;（类型：0]]></description><category></category></item><item><title><![CDATA[2021-02-20]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/113877174</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/113877174</guid><author>cgsdfc</author><pubDate>Sat, 20 Feb 2021 10:46:22 +0800</pubDate><description><![CDATA[北航机试 2018 线段合并
这题网上的说法不太一致，我看到了两个版本的题目，主要的区别在于两个线段允许的连接方式，从慕弋云子的那本北航机试指南 的来看，连接方式限定为“头尾相接”，即规定x坐标小的一点为线段的左端点，另一个则为右端点，规定两个线段连接的方式为“左端点连接右端点”，即线段A的左端点和线段B的右端点相同，则AB相连。
而另外一种连接方式则没有什么限制，只规定端点相同的线段就可以连接。至于真实的情况是怎么样的，我也不清楚。这里就按照第一种限制条件来解题。

题目一：
在二维空间中给定一定数量的线]]></description><category></category></item><item><title><![CDATA[2021-02-18]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/113843962</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/113843962</guid><author>cgsdfc</author><pubDate>Thu, 18 Feb 2021 11:40:55 +0800</pubDate><description><![CDATA[codeup 问题 C: 最短路径
边权是二的整数幂，很大的数，int保存不可能，类似大整数保存下来，模拟加法操作和小于操作，因为是二进制数，操作比一般的大整数要简单，只是用的是稀疏表示，要注意有序。其实不用稀疏表示，也是可以的，因为总共就500个比特位，不多不少，开一个bool[500]的数组，表示一位是否存在，这样加法操作就是O(1)了。
开始的时候想错了，以为直接用指数代替幂进行Dijkstra就行了，最后记录路径再把真正的距离算出来。但是太天真了，错误的具体论证可以看注释，简单来说就是一些在以2的幂]]></description><category></category></item><item><title><![CDATA[2021-02-18]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/113842990</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/113842990</guid><author>cgsdfc</author><pubDate>Thu, 18 Feb 2021 10:46:06 +0800</pubDate><description><![CDATA[codeup 问题 C Legal or Not
#include &lt;cstdio&gt;
#include &lt;queue&gt;
#include &lt;algorithm&gt;
using namespace std;

/*
有向图判环。两种方法：
1. 拓扑排序判环。
2. DFS判环。本质上也是拓扑排序。 
*/

int N, M;
#define MAXN 105

bool G[MAXN][MAXN];
int In[MAXN];

bool TopoSort() {
	qu]]></description><category></category></item><item><title><![CDATA[2021-02-18]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/113841679</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/113841679</guid><author>cgsdfc</author><pubDate>Thu, 18 Feb 2021 09:35:45 +0800</pubDate><description><![CDATA[codeup 问题 D 【宽搜入门】魔板
超时/超内存了很久，最后用散列解决了超时，用占空间最小的散列bool数组解决了超内存。应该有比单纯BFS更高效的算法吧。我这个就是BFS暴力搜索。
#include &lt;cstdio&gt;
#include &lt;queue&gt;
#include &lt;cstring&gt;
#include &lt;cassert&gt;
#include &lt;string&gt; // op是逆序产生的。 
using namespace std;

cons]]></description><category></category></item><item><title><![CDATA[2021-02-12]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/113796658</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/113796658</guid><author>cgsdfc</author><pubDate>Fri, 12 Feb 2021 20:28:23 +0800</pubDate><description><![CDATA[PAT (Advanced Level) Practice
1021 Deepest Root (25 分)
一开始只想到暴力法，即枚举所有节点作为树根，计算树高，得出最大树高。显然有很多重复枚举，最简单的，比如u为根的树，最深的节点为v，则显然以v为根的树，最深的节点肯定也是u，所以算了以u为根，就不用算以v为根。《算法笔记》的参考程序给出了一个定理，直接给出了高效的求法，实现倒不难，就要理解这个定理为什么是对的，要费点脑子。
这个定理的关键是要注意到，所有的最长路径（即树的直径），都有一段公共路径，因此]]></description><category></category></item><item><title><![CDATA[2021-02-09]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/113772416</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/113772416</guid><author>cgsdfc</author><pubDate>Tue, 09 Feb 2021 16:33:21 +0800</pubDate><description><![CDATA[codeup 问题 D More is better
#include &lt;cstdio&gt;
#include &lt;cstring&gt;
#include &lt;cassert&gt;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

/*
并查集求最大联通分量的节点数。
 
房子里的人必须互相为朋友，说明是一个联通图，
题目要求人数尽量多]]></description><category></category></item><item><title><![CDATA[2021-02-09]]></title><link>https://blog.youkuaiyun.com/cgsdfc/article/details/113772210</link><guid>https://blog.youkuaiyun.com/cgsdfc/article/details/113772210</guid><author>cgsdfc</author><pubDate>Tue, 09 Feb 2021 16:23:06 +0800</pubDate><description><![CDATA[codeup 问题 B 序列合并
#include &lt;cstdio&gt;
#include &lt;cmath&gt;
#include &lt;algorithm&gt;
#include &lt;cassert&gt;
using namespace std;

#define MAXN (100000+5)
int N;

struct Heap {
	int heap[MAXN];
	int N;
	/*
	大顶堆。
	*/
	void DownAdjust(int low, int hi)]]></description><category></category></item></channel></rss>