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是否在一条直线上,并且要考虑方向,有交点找到最近的一个交点,求出入射角和反射角,入射角等于反射角就可以到达。