2016 [Offer收割]编程练习赛3

A题:逆序找递减最长的序列,输出前面序列即可

B题:枚举两个数字的因子,第一个用map记录,第二个查找map,求得两个集合相等元素个数,求gcd,除完得到结果

C题:我的做法是二维dp,但是只得了80分,转移的时候枚举当前关卡用多少次答题机会,不会超过a[i]次(最大50),有更好的做法请给我留言,谢谢~

D题:记sum[i,j]为以(i,j)点为左上角顶点的n*m矩阵和
我们有递推式:sum[i,j]=sum[i-1,j-1]+n*m
sum[i,1]=sum[i-1,1]+row(i+n-1)-row(i-1)
sum[1,i]=sum[1,i-1]+col(i+m-1)-col(i-1)
row和col为两个函数,分别求第i行/列的和,可以用公式O(1)求出。
找规律可以发现:
1)对于第j列元素,当行数大于m+j时,sum[i,j]不再变化
2)对于第i行元素,当列数大于n+i时,sum[i,j]不再变化
所以我们只需要预处理出sum[1,2…m][1]和sum[1][1,2…n]

问题转化为是否存在x,使得(sum[i,1]+n*m*x)%k=0
这个可以用扩展欧几里得算法计算
对于sum[1,i]的枚举同理,把sum[i,1]换成sum[1,i]即可
所以总复杂度O((n+m)*q)

PS:最后一题赛后ac,比赛的时候没时间调试了,代码能力还有待提高额额额额

以上纯属个人看法,有什么问题的可以给我留言呢QAQ

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值