首页 > 代码库 > 10day1
10day1
但愿复赛的时候旁边坐的不是学军镇海杭二绍一的众神犇。
?
阅览室
模拟
【问题描述】
一个阅览室每天都要接待大批读者。阅览室开门时间是 0,关门时间是 T。每位读者的到达时间都
不一样,并且想要阅读的刊物不超过 5 本。每位读者心里对自己想看的刊物都有一个排位,到达之后
他会先去找自己最想看的刊物,如果找不到则去找其次想看的刊物。如果找不到任何他想看的刊物,
他会开始等待,直到有一本以上的他想看的刊物被人放回原处。当然,他会先去拿其中自己最想看的
刊物。当他看完某一本刊物后,就把它放回原处,接着去找自己没看过的最想看的刊物。如此下去,
直到看完所有他想看的刊物为止。矛盾出现在两个人同时想要拿同一本刊物的时候。阅览室为了避免
读者之间出现争执,作了一个规定,读者每次在开始等待时先去服务台做一次登记。如果两个人都同
时想要一本刊物,那么先登记的读者将得到这本刊物。如果两个人同时登记,那么先到达阅览室的读
者将得到刊物。没得到的人就只能去找其他的刊物看。阅览室关门时,所有读者都将被强迫离开阅览
室,不再允许继续阅读。
现在阅览室想做一个统计调查,你被要求写一个程序来模拟这个过程计算出所有刊物被阅读的总
次数。当某个读者开始阅读某本刊物时,该刊物的被阅读次数就加 1,无论这本刊物最后有没有被读
完。
【输入】
输入包括了多个测试数据。每个测试数据开头是两个整数 T 和 n(1≤n≤100),分别表示图书馆
关门时间和读者总数。接下来按照读者的到达时间先后依次给出了每位读者的具体描述。每个读者描
述开头是一个整数 t(0≤t<T),表示该读者到达时间。接下来一行开头是一个整数 k(1≤k≤5),
表示该读者想要看的刊物数目。之后跟着 2k 个整数按照读者想要阅读的刊物的顺序依次给出了刊物的
描述。其中第 2i-1 个整数表示刊物的编号 s(0≤s<1000),第 2i 个整数表示该读者读完这本刊物所需的时间。
【输出】
对于每个测试数据,在单独一行里输出所有刊物被阅读的总次数。
【输入样例】
10 4
1
2 1 4 2 5
3
1 2 4
7
3 2 2 1 3 3 2
9
1 4 2
【输出样例】
5
【解题过程】
神一样的模拟题,刚看到的时候很受打击,感觉就是要跪。
题目里面没有给出 T 的范围,但是抱着试一试的心态,还是根据时间来模拟了。更稳妥的做法应该是将时间离散化。
首先我们对于每本书维护一个堆表示登记要看这本书的人,按照登记时间与到达时间排序。
对于某个时刻的某个读者,按顺序找他所有想看的书如果没有人在看那本书,那就看那本书的堆顶是不是自己,如果是,那就将那本书占为己有,否则就继续找下一本书。如果所有想看的书都被占用了,就进行登记(登记前判断下之前是否已经登记过了)。
但是题目里没有说清楚的是,如果一个人没有任何一本想看的书可以看,那么应该对每一本都进行登记还是只对最想看的那一本进行登记?我选择了前一种处理,然后就跪了。
?
影像之结构化特征
FloodFill
【问题描述】
在影像比对中,有一种方法是利用影像中的边缘(edge)资讯,计算每个边缘资讯中具有代表性的
结构化特征,以作为比对两张影像是否相似的判断标准。 Water-filling 方法是从每个边缘图的一
个端点开始,绕着相连的边缘点走并依序编号。若走到某一步时,遇到一个以上不同的连接点,则分
成不同路径同时继续走,直到没有任何连接点为止。如果一个点和另一个点为左右相邻或上下相邻,
就称为连接。
例如,在图一的影像中包含三个边缘图,每个边缘图由一些互相连接的边缘点构成。图中以黑色
的方块代表边缘点,白色的方块代表背景。在 Water-filling 方法中,首先,从第一行(row)开始,
由左至右,由上至下,先找到第一个黑点并编号为 1。接着,找 1 的下一个尚未编号的连接点并编号
为 2。依此方法继续往下一个点前进并依序编号。在编号 6 的点之后有两个尚未编号的连接点,此时,
则分为两条路线,并同时编号为 7 继续往下走。当走到没有任何的相连点时,则结束现有边缘图的编
号,并继续对影像中的其它边缘图编号。走完图一所有边缘图后所得到的编号如图二所示。所以,走
完这三个边缘图所需要的步数分别为 12、7 及 3;因此,12、7 及 3 可以作为代表此张影像的结构化
特征。请注意:位于斜对角上的两点不能算做连接。
请写一个程序计算每个影像中,以 Water-filling 方法走完其中所有的边缘图后,将每个边缘图所需走的步数输出。
【输入】
输入文件包含一个正方形的影像。
第一行是 n(1≤n≤1000),表示正方形的规模。
接下来的 n 行 n 列表示影像内容:0 表示背景的白点,1 表示黑色的边缘点。
【输出】
对于每个输入的影像,以 Water-filling 方法走完所有的边缘图后,先输出此影像中共有几个
边缘图。然后按升序方式输出每个边缘图所需走的步数。
【输入样例 1】
10
0000000000
0011110000
0000010000
0011111000
0010110100
0010010110
0011110010
0100010010
0100000110
0100000000
【输出样例 1】
3
3
7
12
9
【输入样例 2】
000000011
111111101
100000101
111111101
100010101
100010101
111111101
000000001
000000011
【输出样例 2】
2
11
12
【解题过程】
直接用 BFS FloodFill。
听说由于题目是台湾人出的,而台湾人的行和列和大陆这边刚好是反的,然后就跪了。
?
诸侯安置
动态规划
【问题描述】
很久以前,有一个强大的帝国,它的国土成正方形状,如图所示。
这个国家有若干诸侯。由于这些诸侯都曾立下赫赫战功,国王准备给他们每人一块封地(正方形中
的一格)。但是,这些诸侯又非常好战,当两个诸侯位于同一行或同一列时,他们就会开战。如下图为
n=3 时的国土,阴影部分表示诸侯所处的位置。前两幅图中的诸侯可以互相攻击,第三幅则不可以。
国王自然不愿意看到他的诸侯们互相开战,致使国家动荡不安。因此,他希望通过合理的安排诸
侯所处的位置,使他们两两之间都不能攻击。
现在,给出正方形的边长 n,以及需要封地的诸侯数量 k,要求你求出所有可能的安置方案数。
(n≤100,k≤2n2-2n+1)
由于方案数可能很多,你只需要输出方案数除以 504 的余数即可。
【输入】
仅一行,两个整数 n 和 k,中间用一空格隔开。
【输出】
一个整数,表示方案数除以 504 的余数。
【输入样例】
2 2
【输出样例】
4
【Hint】
四种安置方案如图 2-4 所示。注意:镜面和旋转的情况属于不同的方案。
【解题过程】
首先,无解的情况是很好判断的。
很明显是动态规划,但是很可惜我想到的 DP 是错的,然后跪了。
先看这样一幅图:
显然,这样的一幅图与原图是等价的,但比原图更方便处理。
我们可以用 f(i, j) 表示以第 i 列为最后一列,放置 j 个棋子的方案数,则
f(i, j) = sum{ f(k, j-1)*(i-j+1) }, j-1<=k<i
?
(唉,果然 too young too simple,sometimes naive)
(连跪三题不想多说)
10day1