2015年区域赛上海站部分题题解

F题:

题目链接:

https://vjudge.net/problem/HDU-5578

题意:

输入一个字符串,找相同字母的最近距离,输出最近距离。

签到题,用数组标记一下每个字符最后出现的位置,从左到右遍历一遍就可以了,复杂度O(n).

代码:https://paste.ubuntu.com/p/2vjJsKdpjS/

K题

题目链接:https://vjudge.net/problem/HDU-5583

题意:

输入一个只包含0和1的字符串,定义一种计算规则:把这个字符串分成若干部分,每部分只包含0或者1一种数字,计算结果是每部分长度的平方和。 现在可以进行最多一次操作,把0变成1或者把1变成0.问这个字符串的最大计算结果是多少。

比如: 000011,   把第一个1变成0,字符串变成了000001. 结果是5*5+1*1=26. 

题解:

先把这个字符串预处理一下,算出每部分的长度。比如0001110111000 预处理成 3 3 1 3 3 保存在int数组里。

先算一下平方和,然后枚举改变的位置,每次就能O(1)的计算出改变后的结果。记录最大值就可以了。

代码:https://paste.ubuntu.com/p/7kCCPpGfFc/

L题:

题目链接:https://vjudge.net/problem/HDU-5584

题意:

再一个网格图上,行和列是无限的,行和列计数都是从底部开始,坐标都大于0,现在一只青蛙在(x,y)出,设z是x和y的最小公倍数,下一步它可以跳到(x+z,y)或者(x,y+z)。现在告诉它最后所在的位置,问它刚开始所在的位置有多少种情况,它可能一步都没跳。

题解:

已知起点(x,y) 终点(xx,yy),已知终点,反推起点。

z是x和y的最小公倍数,假设x=pt,y=qt, z=pqt. p和q互质。

起点(x,y),下一步可以走到两个位置(x,y+z),(x+z,y),下面我们分别讨论。

1.终点(xx,yy)=(x,y+z)=(pt,qt+pqt)=(pt,q(q+p)t).

由于p和(1+p)互质,所以t是最大公约数,可得t=gcd(x,yy).推导得到起点:

x=pt=xx; 

y=qt=yy*t/(xx+t)

这是一个可能的起点。把起点当成新的终点,继续推导这个过程,知道结束。

需要注意,p,q,t都是整数,在程序中需要判断。

2. 终点(xx,yy)=(x+z,y).

实际情况和1类似.注意到1中y+z>x,即1中xx<yy,2中xx>yy。在编程时,只需要先按大小交换xx,yy的顺序,就可以合并成一种情况处理了。

代码:https://paste.ubuntu.com/p/t4NFYVrPBJ/

B题:

题目链接:https://vjudge.net/problem/HDU-5573

题解:

构造题,注意题目给的范围是n<=2^k<=2^60. 那么容易想到二进制,我们只需要一直往左走,最后一步可以往左可以往右,肯定能构造出1到 2^k中的任意一个数字,如果是奇数,最后一步往左走,如果是偶数,最后一步往右走,比如n是奇数,一直往左走,一直加的话最后能达到(1<<k) , 设多加了m,m等于 (1<<k)-n;那么m/2对应的二进制位为1的位置改成减号就能构造出(1<<k)-m;即要求的n。

构造题一般都是找一些特殊规律,观察数字的规律,二进制等等。

代码:https://paste.ubuntu.com/p/83rCRqxCGM/

A题;

题目链接;https://vjudge.net/problem/HDU-5572

这道题我分了很多情况,考虑直线斜率存在不存在,考虑直线和圆有没有交点,注意要考虑方向,是射线,用直线方程和圆方程联立可能有解,但是求出来的点不一定在射线上,有可能在反向延长线上,没有交点要考虑点A和点B是否在一条直线上,并且要考虑方向,有交点找到最近的一个交点,求出入射角和反射角,入射角等于反射角就可以到达。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值