上个星期因为参加数模比赛导致没有时间写博客(现在还是很失落啊),然后最近都没什么事做,正好把上个星期没写的补完。也正好在这一段时间多学一点新的算法知识,为18天后的蓝桥杯国赛做准备。
刚才把上周的acwing周赛的题目刷了一遍(上周没空所以没参加)。然后日常ac两道题,hh,没办法,实力不济,第三道题我甚至看都不想看。。。然后趁着没做多久,把思路写一写吧。
给定一个正整数 x,你可以对其各个数位上的数字进行反转操作。
反转操作是指将一个数 t 替换为9−t。
请你计算,通过一系列的反转操作(也可以不进行任何操作),能够将 x 转换为的最小可能正整数。
注意,最终数字不能以 0开头。
输入格式
一个正整数 x。
输出格式
一个正整数,表示可以得到的最小可能正整数。
数据范围
所有测试点满足 1≤x≤10^18
输入样例1:
27
输出样例1:
22
输入样例2:
9
输出样例2:
9
输入样例3:
91730629
输出样例3:
91230320
日常周赛第一题为签到题。只要将输入的数字转为字符串,然后对字符串的每一位 t 进行判断,取min(int(t),9-int(t)),当然第一位如果是9则不变。
x = int(input())
x = str(x)
n = len(x)
ln = []
for i in range(n):
if x[0] == '9' and i == 0:
t = int(x[0])
else:
t = min(int(x[i]),9-int(x[i]))
ln.append(str(t))
print(''.join(ln))
给定一个由数字组成的字符串 s,请你计算能够被 4 整除的 s 的子串数量。
子串可以包含前导 0。
例如,如果 s为
124
,则满足条件的子串有 4 个:12
,4
,24
,124
;如果 s 为04
,则满足条件的子串有 3个:0
,4
,04
。输入格式
一个由数字组成的字符串 s。
输出格式
一个整数,表示满足条件的子串数量。
数据范围
前 4 个测试点满足 1≤|s|≤10。
所有测试点满足 1≤|s|≤3×10^5。
输入样例1:
124
输出样例1:
4
输入样例2:
04
输出样例2:
3
输入样例3:
5810438174
输出样例3:
9
首先让我考虑一个数被4整除具有什么样的特征,因为100能够被4整除,所以我们发现,一个数能否被4整除取决于它的后两位能否被4整除。由这个性质和字符串我们不难想到要用动态规划解决这个问题(如果做过类似的题,应该很快会想到动态规划吧)。设dp数组,dp[i]表示由字符s前i个字符能够满足被4整除的子串数量。依据这个设定,那dp[0]当然等于0,dp[1]等于1还是0取决于字符串s的第一个数能否被4整除,如果能被4整除就是1,否则就是0。好了,dp数组的初始条件已定。现在我们假设字符串s前i-1个数字能被4整除的字串数量为dp[i-1],那么,当增加第i个数字会造成什么影响呢?有四种情况:1,第i个数字不能被4整除,且第i个数字和第i-1个数字组成的两位数不被4整除,那么此时增加第i个字符并不会新产生能够被4整除的子串,所以dp[i] = dp[i-1];2,第i个数字能被4整除,第i个数字和第i-1个数字组成的两位数不被4整除,此时能被4整除的子串数量加一(增加的即为i)所以dp[i] = dp[i-1];3,第i个子串不能被4整除,第i个数字和第i-1个数字组成的两位数被4整除,此时能被4整除的子串增加i-1(为什么增加i-1个呢?可以想一想);4第i个子串能被4整除,第i个数字和第i-1个数字组成的两位数被4整除,此时能被4整除的子串增加i(比第三种情况多了一个子串i);综上,一个动态规划模型就出来了,dp[n]即为我们所求答案。
s = input()
n = len(s)
dp = [0 for i in range(n+1)]
if int(s[0])%4 == 0:
dp[1] = 1
for i in range(2,n+1):
if int(s[i-1])%4 == 0 and (int(s[i-2])*10+int(s[i-1]))%4 == 0:
dp[i] = dp[i-1]+i
elif int(s[i-1])%4 != 0 and (int(s[i-2])*10+int(s[i-1]))%4 == 0:
dp[i] = dp[i-1]+i-1
elif int(s[i-1])%4 == 0 and (int(s[i-2])*10+int(s[i-1]))%4 != 0:
dp[i] = dp[i-1]+1
else:
dp[i] = dp[i-1]
print(dp[n])
至于第三题就不想写了,因为太难了,不懂。。。