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

本文解析了四道编程题目,包括模拟旧式电话拨号的时间计算、矩阵与数列的关系求解、数列中特定模式数字的统计以及直线与三角形的几何问题。通过具体的例子展示了算法设计和实现的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值