COCI 2012/2013 6th round, March 9th, 2013

problem A BAKA

旧式电话,摇轮子的,每个数字上都有三到四个字母(和手机上九宫格键盘一样),他每次摇一个字母的用时为字母所在键上数字加一,现在给定一个大写英文字符串,问你摇完要多久。

模拟就好了,注意7和9上有四个字母~~


problem B SUME

给你一个矩阵,和一个位置数列a,左斜对角线上的数为0,其余S[i,j]=a[i]+a[j],已知矩阵,求数列。

先求出a1 然后根据矩阵第一行求出数列就可以了。

S[1,2]=a[1]+a[2],S[1,3]=a[1]+a[3],S[2,3]=a[2]+a[3]。

2、3式相减带入1式即可。


problem C DOBRI

给你一串数列,和一个good数字的定义:若第 i 个数等于他前面的三个数字之和,那么他就是good数,其中可以是同一个数字取三次,或者一个数字取两次另一个一次。

现在问数列中有多少个good数。

由于数据量比较大(5000),需要做优化:

对于Ai 先求出他前面任意两个数字之和,用hash标记好,然后用Ai减去他前面的数字,看是否可以得到已hash的值,若已求出,则是good数。

看似很麻烦,其实如果仔细想清楚,只要两重循环即可。


problem D BUREK

给定N个三角形,和M条直线,直线要么平行于X轴,要么平行于Y轴,问这M条直线分别经过多少个三角形内部(注意)。

最开始想用线段树区间更新求点值。但是因为有1000000的数据而且还要分开做两次,果断超时了(可能是我没写好)。

解法如下:

因为直线都是与轴平行,所以2维坐标可以抽象成一维,不过X方向和Y方向要分开做。

对于任意一个三角形,记录它最左和最右顶点的横坐标,记录最上和最下顶点的纵坐标。

现在以X=6为例,所有最右顶点在6位置以及6左边的三角形和所有最左顶点在6位置以及6右边的三角形的和就是X=6不经过的三角形数,N减去即可。

但是这样还是要扫一遍,也就是N*M 可能会超时。

我们可以用hash的思想,由于点的坐标为非负,而且最多一百万,做下标,数组值为该点有多少个最值点~~然后直接递推就可以求出来了~~

你可能感兴趣的:(解题报告,趣味题,hash)