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的思想,由于点的坐标为非负,而且最多一百万,做下标,数组值为该点有多少个最值点~~然后直接递推就可以求出来了~~