第十四届蓝桥杯大赛软件组国赛 Python大学A组 个人暴力题解

Powered by:NEFU AB-IN

!!!博主个人的暴力题解,基本很少是正解,求轻喷
!!!代码是赛后凭着印象复原的,可能会有记错的

国赛 Python大学A组 个人暴力题解

  • A

    • 思路

      调日期库,模拟

    • 代码

      from sys import setrecursionlimit, stdin, stdout, exit
      from collections import Counter, deque
      from heapq import heapify, heappop, heappush, nlargest, nsmallest
      from bisect import bisect_left, bisect_right
      from datetime import datetime, timedelta
      from string import ascii_lowercase, ascii_uppercase
      from math import log, ceil, gcd, sqrt, fabs
      
      
      class sa:
          def __init__(self, x , y):
              self.x = x
              self.y = y
          def __lt__(self, a):
              return self.x < a.x
              
      
      
      N = int(2e5 + 10)
      M = 20
      INF = int(2e9)
      
      setrecursionlimit(INF)
      input = lambda: stdin.readline().rstrip("\r\n")
      read = lambda: map(int, input().split())
      LTN = lambda x: ord(x.upper()) - 65
      NTL = lambda x: ascii_uppercase[x]
      AR = lambda x: [x] * N
      
      # _____________________________________________________
      
      def check(st):
          if str(st.year).count("1") or str(st.month).count("1") or str(st.day).count("1") or str(st.weekday() + 1).count("1"):
              return True
          else:
              return False
      
      
      st = datetime(year=2023, month=1, day=1)
      ans = 0
      while st.year == 2023:
          # print(st.date())
          if check(st):
              ans += 5
          else:
              ans += 1
          st = st + timedelta(days=1)
          
      
      print(ans)
      
  • B

    • 思路

      模拟

    • 代码

      from sys import setrecursionlimit, stdin, stdout, exit
      from collections import Counter, deque
      from heapq import heapify, heappop, heappush, nlargest, nsmallest
      from bisect import bisect_left, bisect_right
      from datetime import datetime, timedelta
      from string import ascii_lowercase, ascii_uppercase
      from math import log, ceil, gcd, sqrt, fabs
      
      
      class sa:
          def __init__(self, x , y):
              self.x = x
              self.y = y
          def __lt__(self, a):
              return self.x < a.x
              
      
      
      N = int(2e5 + 10)
      M = 20
      INF = int(2e9)
      
      setrecursionlimit(INF)
      input = lambda: stdin.readline().rstrip("\r\n")
      read = lambda: map(int, input().split())
      LTN = lambda x: ord(x.upper()) - 65
      NTL = lambda x: ascii_uppercase[x]
      AR = lambda x: [x] * N
      
      # _____________________________________________________
      
      
      d = Counter(
          {
              0: "1111110",
              1: "0110000",
              2: "1101101",
              3: "1111001",
              4: "0110011",
              5: "1011011",
              6: "1011111",
              7: "1110000",
              8: "1111111",
              9: "1111011"
          }
      )
      
      ans = [
          "0000011",
          "1001011",
          "0000001",
          "0100001",
          "0101011",
          "0110110",
          "1111111",
          "0010110",
          "0101001",
          "0010110",
          "1011100",
          "0100110",
          "1010000",
          "0010011",
          "0001111",
          "0101101",
          "0110101",
          "1101010",
      ]
      
      res = 1
      for i in range(len(ans)):
          cnt = 0
          for j in range(10):
              s, t = ans[i], d[j]
              flag = 1
              for k in range(len(s)):
                  if s[k] == '1' and t[k] == '0':
                      flag = 0
                      break
              cnt += flag
          res *= cnt
      print(res)
      
      
  • C

    • 思路

      模拟

    • 代码

      from sys import setrecursionlimit, stdin, stdout, exit
      from collections import Counter, deque
      from heapq import heapify, heappop, heappush, nlargest, nsmallest
      from bisect import bisect_left, bisect_right
      from datetime import datetime, timedelta
      from string import ascii_lowercase, ascii_uppercase
      from math import log, ceil, gcd, sqrt, fabs
      
      
      class sa:
          def __init__(self, x , y):
              self.x = x
              self.y = y
          def __lt__(self, a):
              return self.x < a.x
              
      
      
      N = int(2e5 + 10)
      M = 20
      INF = int(2e9)
      
      read = lambda: map(int, input().split())
      LTN = lambda x: ord(x.upper()) - 65
      NTL = lambda x: ascii_uppercase[x]
      AR = lambda x: [x] * N
      
      # _____________________________________________________
      
      
      
      n, = read()
      
      def f(x):
          ans = 0
          x = str(x)
          for i in x:
              ans += int(i)
          return ans
      
      ans = 0
      while n:
          n -= f(n)
          ans += 1
      
      print(ans)
      
      
  • D

    • 思路

      排列组合 + 逆元

    • 代码

      from sys import setrecursionlimit, stdin, stdout, exit
      from collections import Counter, deque
      from heapq import heapify, heappop, heappush, nlargest, nsmallest
      from bisect import bisect_left, bisect_right
      from datetime import datetime, timedelta
      from string import ascii_lowercase, ascii_uppercase
      from math import log, ceil, gcd, sqrt, fabs
      
      
      class sa:
          def __init__(self, x , y):
              self.x = x
              self.y = y
          def __lt__(self, a):
              return self.x < a.x
              
      
      
      N = int(1e5 + 10)
      M = 20
      INF = int(2e9)
      
      read = lambda: map(int, input().split())
      LTN = lambda x: ord(x.upper()) - 65
      NTL = lambda x: ascii_uppercase[x]
      AR = lambda x: [x] * N
      
      # _____________________________________________________
      
      MOD = 998244353
      fact = AR(0)
      
      def init():
          fact[0] = 1
          for i in range(1, N):
              fact[i] = fact[i - 1] * i % MOD
          
      init()
      n, m = read()
      
      a = n - 3 * m
      b = m
      
      fz = fact[a]
      fm = pow(fact[a - b] * fact[b] % MOD, MOD - 2, MOD)
      
      print(fz * fm * 10 % MOD)
      
      
      
  • E

    • 思路

      01背包
      我写的不是正解,会有贪心的感觉

    • 代码

      from sys import setrecursionlimit, stdin, stdout, exit
      from collections import Counter, deque
      from heapq import heapify, heappop, heappush, nlargest, nsmallest
      from bisect import bisect_left, bisect_right
      from datetime import datetime, timedelta
      from string import ascii_lowercase, ascii_uppercase
      from math import log, ceil, gcd, sqrt, fabs
      
      
      class sa:
          def __init__(self, x , y):
              self.x = x
              self.y = y
          def __lt__(self, a):
              return self.x < a.x
              
      
      
      N = int(5e3 + 10)
      M = 20
      INF = int(2e9)
      
      read = lambda: map(int, input().split())
      LTN = lambda x: ord(x.upper()) - 65
      NTL = lambda x: ascii_uppercase[x]
      AR = lambda x: [x] * N
      
      # _____________________________________________________
      
      w = AR(0)
      n, a, b = read()
      w[1:] = read()
      
      def init(a, b):
          w1, dpa, dpb, st = AR(0), AR(0), AR(0), AR(0)
          dp = [[] for _ in range(N)] 
      
          for i in range(1, n + 1):
              for j in range(a, w[i] - 1, -1):
                  if dpa[j - w[i]] + w[i] > dpa[j]:
                      dpa[j] = dpa[j - w[i]] + w[i]
                      dp[j] = dp[j - w[i]][:]
                      dp[j].append(i)
      
          for i in dp[a]:
              st[i] = 1
      
      
          for i in range(1, n + 1):
              if st[i] == 0:
                  w1[i] = w[i]
      
          for i in range(1, n + 1):
              for j in range(b, w1[i] - 1, -1):
                  if dpb[j - w1[i]] + w1[i] > dpb[j]:
                      dpb[j] = dpb[j - w1[i]] + w1[i]
      
          return dpa[a] + dpb[b]
      
      
      # ____先a后b
      # ____先b后a
      print(max(init(a, b), init(b, a)))
      
      
  • F

    • 思路

      DP + BFS

    • 代码

      from sys import setrecursionlimit, stdin, stdout, exit
      from collections import Counter, deque
      from heapq import heapify, heappop, heappush, nlargest, nsmallest
      from bisect import bisect_left, bisect_right
      from datetime import datetime, timedelta
      from string import ascii_lowercase, ascii_uppercase
      from math import log, ceil, gcd, sqrt, fabs
      
      
      class sa:
          def __init__(self, x , y):
              self.x = x
              self.y = y
              
      
      
      N = int(1010)
      M = 20
      INF = int(2e9)
      
      read = lambda: map(int, input().split())
      LTN = lambda x: ord(x.upper()) - 65
      NTL = lambda x: ascii_uppercase[x]
      AR = lambda x: [x] * N
      
      # _____________________________________________________
      
      g = [AR(0) for _ in range(N)]
      n, = read()
      
      for i in range(1, n + 1):
          g[i][1:] = read()
      
      
      # 首先求每一行的每个点的可递增最长序列的长度,0代表走不动,1代表可走一格
      # 首先求往右的
      
      dpr, dpl = [AR(0) for _ in range(N)], [AR(0) for _ in range(N)]
      for i in range(1, n + 1):
          for j in range(n - 1, 0, -1):
              if g[i][j] < g[i][j + 1]:
                  dpr[i][j] = dpr[i][j + 1] + 1
              else:
                  dpr[i][j] = 0
      
          for j in range(1, n + 1):
              if g[i][j] < g[i][j - 1]:
                  dpl[i][j] = dpl[i][j - 1] + 1
              else:
                  dpl[i][j] = 0
      
      dist = [AR(INF) for _ in range(N)]
      q = deque()
      
      dx = [1, 0]
      dy = [0, 1]
      
      def bfs():
          dist[1][1] = 0
          q.appendleft(sa(1, 1))
          while len(q):
              point = q.pop()
              x, y = point.x, point.y
      
              for i in range(2):
                  x1 = x + dx[i]
                  y1 = y + dy[i]
                  if x1 < 1 or x1 > n or y1 < 1 or y1 > n:
                      continue
                  if dist[x1][y1] > dist[x][y] + 1:
                      dist[x1][y1] = dist[x][y] + 1
                      if x1 == n and y1 == n:
                          return dist[x1][y1]
                      q.appendleft(sa(x1, y1))
              
              l, r = dpl[x][y], dpr[x][y]
              if l != 0: 
                  for i in range(1, l + 1):
                      x1, y1 = x, y - i
                      if x1 < 1 or x1 > n or y1 < 1 or y1 > n:
                          continue
                      if dist[x1][y1] > dist[x][y] + 1:
                          dist[x1][y1] = dist[x][y] + 1
                          if x1 == n and y1 == n:
                              return dist[x1][y1]
                          q.appendleft(sa(x1, y1))
              if r != 0:
                  for i in range(1, r + 1):
                      x1, y1 = x, y + i
                      if x1 < 1 or x1 > n or y1 < 1 or y1 > n:
                          continue
                      if dist[x1][y1] > dist[x][y] + 1:
                          dist[x1][y1] = dist[x][y] + 1
                          if x1 == n and y1 == n:
                              return dist[x1][y1]
                          q.appendleft(sa(x1, y1))
          return dist[n][n]
      
      print(bfs())
      
  • G

    • 思路

      至今没搞懂题意,是一个数只能取一次,还是一个数能取三次,如果能取三次,那么样例就不对,如果只能取一次,n给的范围能取到1,索性直接暴力了

    • 代码

      from sys import setrecursionlimit, stdin, stdout, exit
      from collections import Counter, deque
      from heapq import heapify, heappop, heappush, nlargest, nsmallest
      from bisect import bisect_left, bisect_right
      from datetime import datetime, timedelta
      from string import ascii_lowercase, ascii_uppercase
      from math import log, ceil, gcd, sqrt, fabs
      
      
      class sa:
          def __init__(self, x , y):
              self.x = x
              self.y = y
          def __lt__(self, a):
              return self.x < a.x
              
      
      
      N = int(2e5 + 10)
      M = 20
      INF = int(2e9)
      
      read = lambda: map(int, input().split())
      LTN = lambda x: ord(x.upper()) - 65
      NTL = lambda x: ascii_uppercase[x]
      AR = lambda x: [x] * N
      
      # _____________________________________________________
      
      
      # 得出结论 这个数列只有两种数字 只有aab abb两种组合 
      # aab 满足 2 * a > b
      # abb 满足 2 * b > a
      
      # 问题转化为 将数组中的数字转换为a, b 代价最小 
      # 思路 二分a 找b
      
      # 暴力版本
      
      a = AR(0)
      n, = read()
      a[1:] = read()
      
      ans = INF
      
      def check(p, q):
          # p为双边
          cnt = 0
          for i in range(1, n + 1):
              cnt += min(abs(a[i] - p), abs(a[i] - q))
          return cnt
      
      
      l, r = min(a[1:]), max(a[1:])
      
      for i in range(l, r + 1): # i双边
          for j in range(l, r + 1):
              if 2 * i > j and 2 * j > i:
                  ans = min(ans, check(i, j))
      
      
      print(ans)
      
  • H

    • 思路

      不是特别会
      BFS + dijkstra

    • 代码

      from sys import setrecursionlimit, stdin, stdout, exit
      from collections import Counter, deque
      from heapq import heapify, heappop, heappush, nlargest, nsmallest
      from bisect import bisect_left, bisect_right
      from datetime import datetime, timedelta
      from string import ascii_lowercase, ascii_uppercase
      from math import log, ceil, gcd, sqrt, fabs
      
      
      class sa:
          def __init__(self, x, y):
              self.x = x
              self.y = y
      
          def __lt__(self, a):
              return self.x < a.x
      
      
      N = int(1e6 + 10)
      M = 20
      INF = int(2e9)
      
      read = lambda: map(int, input().split())
      LTN = lambda x: ord(x.upper()) - 65
      NTL = lambda x: ascii_uppercase[x]
      AR = lambda x: [x] * N
      
      # _____________________________________________________
      
      g = [[] for _ in range(N)]
      gg = [[] for _ in range(N)]
      
      n, q = read()
      color = AR(0)
      
      
      def f(x, y, z):
          dist = AR(INF)
          dist[x] = 0
          st = AR(0)
          q = []
          heappush(q, [0, x])
          while q:
              t = heappop(q)
              v, dst = t[0], t[1]
              if st[x]:
                  continue
              st[x] = 1
              for [v, w] in gg[x]:
                  if dist[v] > dist[x] + w:
                      dist[v] = dist[x] + w
                      heappush(q, [v, dist[v]])
      
          for i in range(1, n + 1):
              if dist[i] <= y:
                  color[i] = z
      
      
      for i in range(1, n // 2 + 1):
          g[i].append([i * 2, 1])
          g[i].append([i * 2 + 1, 1])
          g[i * 2].append([i, 1])
          g[i * 2 + 1].append([i, 1])
      
      
      def bfs(i, j):
          st = AR(0)
          st[i] = 1
          q = deque()
          q.appendleft([i, 0])
          while len(q):
              t = q.pop()
              u, dst = t[0], t[1]
              for [v, w] in g[u]:
                  if st[v] == 0:
                      q.appendleft([v, dst + w])
                      st[v] = 1
                      if v == j:
                          return dst + w
      
      
      for i in range(1, n + 1):
          for j in range(i + 1, n + 1):
              if i == j:
                  gg[i].append([i, 0])
                  continue
              ans = bfs(i, j)
              gg[i].append([j, ans])
              gg[j].append([i, ans])
      
      lst = AR(0)
      for i in range(q):
          lst = list(read())
          if len(lst) == 4:
              x, y, z = lst[1], lst[2], lst[3]
              f(x, y, z)
          else:
              print(color[lst[1]])
      '''
      6 6
      1 1 1 1
      2 3
      1 5 2 2
      2 4
      2 1
      2 3
      '''
      
      
  • I

    • 思路

      不会
      直接暴力

    • 代码

      from sys import setrecursionlimit, stdin, stdout, exit
      from collections import Counter, deque
      from heapq import heapify, heappop, heappush, nlargest, nsmallest
      from bisect import bisect_left, bisect_right
      from datetime import datetime, timedelta
      from string import ascii_lowercase, ascii_uppercase
      from math import log, ceil, gcd, sqrt, fabs
      
      
      class sa:
          def __init__(self, x , y):
              self.x = x
              self.y = y
          def __lt__(self, a):
              return self.x < a.x
              
      
      
      N = int(2e5 + 10)
      M = 20
      INF = int(2e9)
      
      read = lambda: map(int, input().split())
      LTN = lambda x: ord(x.upper()) - 65
      NTL = lambda x: ascii_uppercase[x]
      AR = lambda x: [x] * N
      
      # _____________________________________________________
      
      a = AR(0)
      n, p, q = read()
      a[1:] = read()
      
      ans = abs(a[p] - a[q])
      
      for i in range(1, n + 1):
          for j in range(i + 1, n + 1):
              if i > p and j < q:
                  continue
      
              b = sorted(a[i : j + 1])
              an = a[:i] + b + a[j+1 :]
              ans = max(ans, abs(an[p] - an[q]))
      print(ans)