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)

(连跪三题不想多说)

posted @ 2014-10-24 19:58  lsdsjy  阅读(236)  评论(2编辑  收藏  举报