acw周赛刷题

上个星期因为参加数模比赛导致没有时间写博客(现在还是很失落啊),然后最近都没什么事做,正好把上个星期没写的补完。也正好在这一段时间多学一点新的算法知识,为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 个:12424124;如果 s 为 04,则满足条件的子串有 3个:0404

输入格式

一个由数字组成的字符串 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])

 

至于第三题就不想写了,因为太难了,不懂。。。 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值