当前位置:   article > 正文

蓝桥杯-第九届蓝桥杯C语言A组/B组/C组-Python题解_python蓝桥杯的abc组

python蓝桥杯的abc组

  1. #等比数列求和,然后约分
  2. temp=pow(2,20)
  3. a=2*(temp-1)
  4. b=temp
  5. #求最大公约数
  6. def gcd(a,b):
  7. return gcd(b,a%b) if b!=0 else a
  8. number=gcd(a,b)
  9. print(str(a//number)+'/'+str(b//number))

 

  1. #判断闰年
  2. def isLeapYear(n):
  3. if (n%4==0 and n%100!=0) or (n%400==0):
  4. return True
  5. return False
  6. #计算一共有多少天
  7. total_day=0
  8. for i in range(1901,2001):
  9. if isLeapYear(i):
  10. total_day+=366
  11. else:
  12. total_day+=365
  13. #计算一共有多少周,就有多少个星期一
  14. print(total_day//7)

 

  1. matrix=[[0]*10 for i in range(10)]
  2. for i in range(10):
  3. matrix[i]=list(map(int,input().split()))
  4. sum=1
  5. #求乘积
  6. for i in range(10):
  7. for j in range(10):
  8. sum*=matrix[i][j]
  9. #求sum末尾有多少个0
  10. ans=0
  11. while sum!=0:
  12. a=sum%10
  13. if a==0:
  14. ans+=1
  15. sum//=10
  16. else:
  17. break
  18. print(ans)

 

  1. #数字的3^i*5^j*7^k分解
  2. count=0
  3. n=59084709587505
  4. for i in range(30):
  5. for j in range(30):
  6. for k in range(30):
  7. if pow(3,i)*pow(5,j)*pow(7,k)<=n:
  8. count+=1
  9. #排除i=j=k=0情况
  10. print(count-1)

标题:航班时间

【问题背景】

小h前往美国参加了蓝桥杯国际赛。小h的女朋友发现小h上午十点出发,上午十二点到达美国,于是感叹到“现在飞机飞得真快,两小时就能到美国了”。

小h对超音速飞行感到十分恐惧。仔细观察后发现飞机的起降时间都是当地时间。由于北京和美国东部有12小时时差,故飞机总共需要14小时的飞行时间。

不久后小h的女朋友去中东交换。小h并不知道中东与北京的时差。但是小h得到了女朋友来回航班的起降时间。小h想知道女朋友的航班飞行时间是多少。

【问题描述】

对于一个可能跨时区的航班,给定来回程的起降时间。假设飞机来回飞行时间相同,求飞机的飞行时间。

【输入格式】

从标准输入读入数据。

一个输入包含多组数据。

输入第一行为一个正整数T,表示输入数据组数。

每组数据包含两行,第一行为去程的 起降 时间,第二行为回程的 起降 时间。

起降时间的格式如下

h1:m1:s1 h2:m2:s2

h1:m1:s1 h3:m3:s3 (+1)

h1:m1:s1 h4:m4:s4 (+2)

表示该航班在当地时间h1时m1分s1秒起飞,

第一种格式表示在当地时间 当日 h2时m2分s2秒降落

第二种格式表示在当地时间 次日 h3时m3分s3秒降落。

第三种格式表示在当地时间 第三天 h4时m4分s4秒降落。

对于此题目中的所有以 h:m:s 形式给出的时间, 保证 ( 0<=h<=23, 0<=m,s<=59 ).

【输出格式】

输出到标准输出。

对于每一组数据输出一行一个时间hh:mm:ss,表示飞行时间为hh小时mm分ss秒。

注意,当时间为一位数时,要补齐前导零。如三小时四分五秒应写为03:04:05。

【样例输入】

3

17:48:19 21:57:24

11:05:18 15:14:23

17:21:07 00:31:46 (+1)

23:02:41 16:13:20 (+1)

10:19:19 20:41:24

22:19:04 16:41:09 (+1)

【样例输出】

04:09:05

12:10:39

14:22:05

  1. #设输入的每组数据为
  2. #a b
  3. #c d
  4. #设航班飞行时间是Time,时差是T
  5. #则有:
  6. #a+Time=b-T
  7. #c+Time=d+T
  8. #联立解Time
  9. #处理时间一般是转换为秒方便计算
  10. #分割读入的字符串
  11. import re
  12. #数据组数
  13. t=int(input())
  14. #去程和回程总时间
  15. total_time=0
  16. for i in range(t):
  17. total_time=0
  18. string=input()
  19. #去程起降时间
  20. time_list=re.split('\s+|:',string)
  21. #计算去程所用秒数
  22. #当日降落
  23. if len(time_list)==6:
  24. total_time+=int(time_list[3])*3600+int(time_list[4])*60+int(time_list[5])-(int(time_list[0])*3600+int(time_list[1])*60+int(time_list[2]))
  25. #非当日降落
  26. else:
  27. total_time+=int(time_list[6][2])*24*3600+int(time_list[3])*3600+int(time_list[4])*60+int(time_list[5])-(int(time_list[0])*3600+int(time_list[1])*60+int(time_list[2]))
  28. #回程起降时间
  29. string=input()
  30. time_list=re.split('\s+|:',string)
  31. if len(time_list)==6:
  32. total_time+=int(time_list[3])*3600+int(time_list[4])*60+int(time_list[5])-(int(time_list[0])*3600+int(time_list[1])*60+int(time_list[2]))
  33. else:
  34. total_time+=int(time_list[6][2])*24*3600+int(time_list[3])*3600+int(time_list[4])*60+int(time_list[5])-(int(time_list[0])*3600+int(time_list[1])*60+int(time_list[2]))
  35. total_time//=2
  36. #输出结果
  37. ans=''
  38. #注意python中的除法
  39. h=total_time//3600
  40. m=total_time//60%60
  41. s=total_time%60
  42. if h<10:
  43. ans+='0'
  44. ans+=str(h)
  45. ans+=':'
  46. else:
  47. ans+=str(h)
  48. ans+=':'
  49. if m<10:
  50. ans+='0'
  51. ans+=str(m)
  52. ans+=':'
  53. else:
  54. ans+=str(m)
  55. ans+=':'
  56. if s<10:
  57. ans+='0'
  58. ans+=str(s)
  59. else:
  60. ans+=str(s)
  61. print(ans)

标题:三体攻击

【题目描述】

三体人将对地球发起攻击。为了抵御攻击,地球人派出了 A × B × C 艘战舰,在太空中排成一个 A 层 B 行 C 列的立方体。其中,第 i 层第 j 行第 k 列的战舰(记为战舰 (i, j, k))的生命值为 d(i, j, k)。

三体人将会对地球发起 m 轮“立方体攻击”,每次攻击会对一个小立方体中的所有战舰都造成相同的伤害。具体地,第 t 轮攻击用 7 个参数 lat, rat, lbt, rbt, lct, rct, ht 描述;

所有满足 i ∈ [lat, rat],j ∈ [lbt, rbt],k ∈ [lct, rct] 的战舰 (i, j, k) 会受到 ht 的伤害。如果一个战舰累计受到的总伤害超过其防御力,那么这个战舰会爆炸。

地球指挥官希望你能告诉他,第一艘爆炸的战舰是在哪一轮攻击后爆炸的。

【输入格式】

从标准输入读入数据。

第一行包括 4 个正整数 A, B, C, m;

第二行包含 A × B × C 个整数,其中第 ((i − 1)×B + (j − 1)) × C + (k − 1)+1 个数为 d(i, j, k);

第 3 到第 m + 2 行中,第 (t − 2) 行包含 7 个正整数 lat, rat, lbt, rbt, lct, rct, ht。

【输出格式】

输出到标准输出。

输出第一个爆炸的战舰是在哪一轮攻击后爆炸的。保证一定存在这样的战舰。

【样例输入】

2 2 2 3

1 1 1 1 1 1 1 1

1 2 1 2 1 1 1

1 1 1 2 1 2 1

1 1 1 1 1 1 2

【样例输出】

2

【样例解释】

在第 2 轮攻击后,战舰 (1,1,1) 总共受到了 2 点伤害,超出其防御力导致爆炸。

  1. #按照题目进行模拟
  2. A,B,C,m=map(int,input().split())
  3. #战舰生命值列表
  4. life_list=list(map(int,input().split()))
  5. #战舰生命值和编号映射
  6. d={}
  7. #建立生命值和编号映射
  8. for i in range(1,A+1):
  9. for j in range(1,B+1):
  10. for k in range(1,C+1):
  11. d[(i,j,k)]=life_list[((i-1)*B+(j-1))*C+(k-1)]
  12. print(d)
  13. flag=False
  14. #进行战舰攻击模拟
  15. for times in range(1,m+1):
  16. number_list=list(map(int,input().split()))
  17. li=number_list[0]
  18. ri=number_list[1]
  19. lj=number_list[2]
  20. rj=number_list[3]
  21. lk=number_list[4]
  22. rk=number_list[5]
  23. #遍历战舰集合,进行生命值更新
  24. for key in d.keys():
  25. if li<=key[0]<=ri and lj<=key[1]<=rj and lk<=key[2]<=rk:
  26. d[key]-=number_list[6]
  27. #按照题意是生命值小于0算作爆炸
  28. if d[key]<0:
  29. print(times)
  30. flag=True
  31. break
  32. if flag:
  33. break

标题:倍数问题

【题目描述】

众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。

【输入格式】

从标准输入读入数据。

第一行包括 2 个正整数 n, K。

第二行 n 个正整数,代表给定的 n 个数。

【输出格式】

输出到标准输出。

输出一行一个整数代表所求的和。

【样例入】

4 3

1 2 3 4

【样例输出】

9

【样例解释】

选择2、3、4。

  1. n,k=map(int,input().split())
  2. number_list=list(map(int,input().split()))
  3. #最大值
  4. max_value=-10**10
  5. #当前数字是否已经被遍历
  6. has_checked=[]
  7. #深度优先搜索
  8. def dfs(temp_sum,count):
  9. global max_value
  10. if count==3:
  11. max_value=max(max_value,temp_sum)
  12. return
  13. for i in range(len(number_list)):
  14. if i not in has_checked:
  15. has_checked.append(i)
  16. dfs(temp_sum+number_list[i],count+1)
  17. #试探结束后回退,进行下一次试探
  18. has_checked.remove(i)
  19. dfs(0,0)
  20. print(max_value)

标题:第几天

2000年的1月1日,是那一年的第1天。

那么,2000年的5月4日,是那一年的第几天?

:31+29+31+30+4

标题:明码

汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛。

16点阵的字库把每个汉字看成是16x16个像素信息。并把这些信息记录在字节中。

一个字节可以存储8位信息,用32个字节就可以存一个汉字的字形了。

把每个字节转为2进制表示,1表示墨迹,0表示底色。每行2个字节,

一共16行,布局是:

第1字节,第2字节

第3字节,第4字节

....

第31字节, 第32字节

这道题目是给你一段多个汉字组成的信息,每个汉字用32个字节表示,这里给出了字节作为有符号整数的值。

题目的要求隐藏在这些信息中。你的任务是复原这些汉字的字形,从中看出题目的要求,并根据要求填写答案。

这段信息是(一共10个汉字):

4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0

16 64 16 64 34 68 127 126 66 -124 67 4 66 4 66 -124 126 100 66 36 66 4 66 4 66 4 126 4 66 40 0 16

4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0

0 -128 64 -128 48 -128 17 8 1 -4 2 8 8 80 16 64 32 64 -32 64 32 -96 32 -96 33 16 34 8 36 14 40 4

4 0 3 0 1 0 0 4 -1 -2 4 0 4 16 7 -8 4 16 4 16 4 16 8 16 8 16 16 16 32 -96 64 64

16 64 20 72 62 -4 73 32 5 16 1 0 63 -8 1 0 -1 -2 0 64 0 80 63 -8 8 64 4 64 1 64 0 -128

0 16 63 -8 1 0 1 0 1 0 1 4 -1 -2 1 0 1 0 1 0 1 0 1 0 1 0 1 0 5 0 2 0

2 0 2 0 7 -16 8 32 24 64 37 -128 2 -128 12 -128 113 -4 2 8 12 16 18 32 33 -64 1 0 14 0 112 0

1 0 1 0 1 0 9 32 9 16 17 12 17 4 33 16 65 16 1 32 1 64 0 -128 1 0 2 0 12 0 112 0

0 0 0 0 7 -16 24 24 48 12 56 12 0 56 0 -32 0 -64 0 -128 0 0 0 0 1 -128 3 -64 1 -128 0 0

  1. #每一行代表了一个汉字
  2. #每一行有32个数字,代表了32个字节
  3. #两个字节排成一行
  4. #将每个数字转换为二进制补码,
  5. #如果是0输出空格
  6. #是1输出*
  7. #最终可显示所有的汉字图形
  8. n=10
  9. m=32
  10. matrix=[[0]*m for i in range(n)]
  11. #将十进制数字转换为8位二进制补码
  12. def intToBin8(i):
  13. return (bin(((1 << 8) - 1) & i)[2:]).zfill(8)
  14. for i in range(n):
  15. matrix[i]=list(map(int,input().split()))
  16. for i in range(n):
  17. count=0
  18. for j in range(m):
  19. #按照字节处理
  20. part=intToBin8(matrix[i][j])
  21. for item in part:
  22. if item=='0':
  23. print(' ',end='')
  24. if item=='1':
  25. print('* ',end='')
  26. count+=1
  27. #两个字节为一层
  28. if count%2==0:
  29. print()
  30. #处理完了一个汉字
  31. print()

标题:测试次数

x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。

各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通。

x星球有很多高耸入云的高塔,刚好可以用来做耐摔测试。塔的每一层高度都是一样的,与地球上稍有不同的是,他们的第一层不是地面,而是相当于我们的2楼。

如果手机从第7层扔下去没摔坏,但第8层摔坏了,则手机耐摔指数=7。

特别地,如果手机从第1层扔下去就坏了,则耐摔指数=0。

如果到了塔的最高层第n层扔没摔坏,则耐摔指数=n

为了减少测试次数,从每个厂家抽样3部手机参加测试。

某次测试的塔高为1000层,如果我们总是采用最佳策略,在最坏的运气下最多需要测试多少次才能确定手机的耐摔指数呢?

请填写这个最多测试次数。

注意:需要填写的是一个整数,不要填写任何多余内容。

  1. #动态规划
  2. dp=[[0]*1001 for i in range(4)]
  3. #dp[i][j]代表共有i部手机,j层的最坏运气下最多测试次数
  4. #先初始化为层数
  5. for i in range(1,4):
  6. for j in range(1,1001):
  7. dp[i][j]=j
  8. #在第k层摔手机分为两种情况
  9. #1.没有摔坏,向楼上走,去剩余的j-k层测试,则dp[i][j]=dp[i][j-k]+1,+1是因为此次没有摔坏
  10. #2.摔坏了,向楼下走,手机数量-1,去剩下的k-1层测试 dp[i][j]=dp[i-1][k-1]
  11. #综上在第k层dp[i][j]=max(dp[i][j-k]+1,dp[i-1][k-1]),max是保证两种情况都能发生
  12. #则总的转移方程为dp[i][j]=min(dp[i][j],max(dp[i][j-k]+1,dp[i-1][k-1])),1<=k<j,k取
  13. #不同的值代表在不同的层进行摔手机尝试
  14. for i in range(2,4):
  15. for j in range(1,1001):
  16. for k in range(1,j):
  17. dp[i][j]=min(dp[i][j],max(dp[i][j-k]+1,dp[i-1][k-1]))
  18. print(dp[3][1000])

 

标题:递增三元组

给定三个整数数组

A = [A1, A2, ... AN],

B = [B1, B2, ... BN],

C = [C1, C2, ... CN],

请你统计有多少个三元组(i, j, k) 满足:

1. 1 <= i, j, k <= N

2. Ai < Bj < Ck

【输入格式】

第一行包含一个整数N。

第二行包含N个整数A1, A2, ... AN。

第三行包含N个整数B1, B2, ... BN。

第四行包含N个整数C1, C2, ... CN。

对于30%的数据,1 <= N <= 100

对于60%的数据,1 <= N <= 1000

对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000

【输出格式】

一个整数表示答案

【样例输入】

3

1 1 1

2 2 2

3 3 3

【样例输出】

27

  1. ans=0
  2. number_list1=[]
  3. number_list2=[]
  4. number_list3=[]
  5. n=int(input())
  6. number_list1=list(map(int,input().split()))
  7. number_list2=list(map(int,input().split()))
  8. number_list3=list(map(int,input().split()))
  9. for i in range(n):
  10. for j in range(n):
  11. for k in range(n):
  12. if number_list1[i]<number_list2[j]<number_list3[k]:
  13. ans+=1
  14. print(ans)

标题:日志统计

小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有N行。其中每一行的格式是:

ts id

表示在ts时刻编号id的帖子收到一个"赞"。

现在小明想统计有哪些帖子曾经是"热帖"。如果一个帖子曾在任意一个长度为D的时间段内收到不少于K个赞,小明就认为这个帖子曾是"热帖"。

具体来说,如果存在某个时刻T满足该帖在[T, T+D)这段时间内(注意是左闭右开区间)收到不少于K个赞,该帖就曾是"热帖"。

给定日志,请你帮助小明统计出所有曾是"热帖"的帖子编号。

【输入格式】

第一行包含三个整数N、D和K。

以下N行每行一条日志,包含两个整数ts和id。

对于50%的数据,1 <= K <= N <= 1000

对于100%的数据,1 <= K <= N <= 100000 0 <= ts <= 100000 0 <= id <= 100000

【输出格式】

按从小到大的顺序输出热帖id。每个id一行。

【输入样例】

7 10 2

0 1

0 10

10 10

10 1

9 1

100 3

100 3

【输出样例】

1

3

  1. #日志id集合
  2. id_set=set()
  3. #每个id的点赞时间
  4. id_time_list=[[]*100001 for i in range(100001)]
  5. n,d,k=map(int,input().split())
  6. #判断id的日志是否是热帖
  7. def isHot(id):
  8. global n,d,k
  9. total_number=len(id_time_list[id])
  10. if total_number<k:
  11. return False
  12. id_time_list[id].sort()
  13. #sum是时间[l,r)内的点赞数量
  14. l,r,sum=0,0,0
  15. while l<=r<total_number:
  16. sum+=1
  17. if sum>=k:
  18. if id_time_list[id][r]<d+id_time_list[id][l]:
  19. #点赞数量大于k,并且时间间隔小于d
  20. return True
  21. else:
  22. #取下一个时间段
  23. sum-=1
  24. l+=1
  25. r+=1
  26. for i in range(n):
  27. time,id=map(int,input().split())
  28. id_set.add(id)
  29. id_time_list[id].append(time)
  30. for i in id_set:
  31. if isHot(i):
  32. print(i)

标题:哪天返回

小明被不明势力劫持。后莫名其妙被扔到x星站再无问津。小明得知每天都有飞船飞往地球,但需要108元的船票,而他却身无分文。

他决定在x星战打工。好心的老板答应包食宿,第1天给他1元钱。

并且,以后的每一天都比前一天多2元钱,直到他有足够的钱买票。

请计算一下,小明在第几天就能凑够108元,返回地球。

要求提交的是一个整数,表示第几天。请不要提交任何多余的内容。

  1. day=1
  2. money=1
  3. sum=1
  4. while sum<108:
  5. money+=2
  6. day+=1
  7. sum+=money
  8. print(day)

标题:猴子分香蕉

5只猴子是好朋友,在海边的椰子树上睡着了。这期间,有商船把一大堆香蕉忘记在沙滩上离去。

第1只猴子醒来,把香蕉均分成5堆,还剩下1个,就吃掉并把自己的一份藏起来继续睡觉。

第2只猴子醒来,重新把香蕉均分成5堆,还剩下2个,就吃掉并把自己的一份藏起来继续睡觉。

第3只猴子醒来,重新把香蕉均分成5堆,还剩下3个,就吃掉并把自己的一份藏起来继续睡觉。

第4只猴子醒来,重新把香蕉均分成5堆,还剩下4个,就吃掉并把自己的一份藏起来继续睡觉。

第5只猴子醒来,重新把香蕉均分成5堆,哈哈,正好不剩!

请计算一开始最少有多少个香蕉。

需要提交的是一个整数,不要填写任何多余的内容。

  1. #香蕉的数量,迭代尝试解
  2. banana_number=5
  3. monkey1,monkey2,monkey3,monkey4,monkey5=0,0,0,0,0
  4. #寻找满足条件的解
  5. while True:
  6. banana_number+=1
  7. monkey1=banana_number
  8. if monkey1%5==1 and monkey1>1:
  9. monkey2=(monkey1-1)//5*4
  10. if monkey2%5==2 and monkey2>2:
  11. monkey3=(monkey2-2)//5*4
  12. if monkey3%5==3 and monkey3>3:
  13. monkey4=(monkey3-3)//5*4
  14. if monkey4%5==4 and monkey4>4:
  15. monkey5=(monkey4-4)//5*4
  16. if monkey5%5==0 and monkey5>0:
  17. break
  18. print(banana_number)

标题:次数差

x星球有26只球队,分别用a~z的26个字母代表。他们总是不停地比赛。

在某一赛段,哪个球队获胜了,就记录下代表它的字母,这样就形成一个长长的串。

国王总是询问:获胜次数最多的和获胜次数最少的有多大差距?(当然,他不关心那些一次也没获胜的,认为他们在怠工罢了)

输入,一个串,表示球队获胜情况(保证串的长度<1000)

要求输出一个数字,表示出现次数最多的字母比出现次数最少的字母多了多少次。

比如:

输入:

abaabcaa

则程序应该输出:

4

解释:a出现5次,最多;c出现1次,最少。5-1=4

再比如:

输入:

bbccccddaaaacccc

程序应该输出:

6

  1. char_set={}
  2. string=input()
  3. for i in string:
  4. if i not in char_set:
  5. char_set[i]=1
  6. else:
  7. char_set[i]+=1
  8. max_value=-10**10
  9. min_value=10**10
  10. for item in char_set.values():
  11. if item>max_value:
  12. max_value=item
  13. if item<min_value:
  14. min_value=item
  15. print(max_value-min_value)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/592685
推荐阅读
相关标签
  

闽ICP备14008679号