Lời 88king Vin Mở Đầu

Kingsun Win Game Bài 99,Vip88 Game Bài Manclub

Cuộc Thi Lập Trình Đội Nhóm Năm 2025 - Giải Thuật Cá Nhân Bằng Python

HowieHz
2025-04-19
Kiến Thức Truyền Thừa > Phân Tích Cuộc Thi > Hồ Sơ Giải Thuật

🌍 Tiếng Việt

80

Lần đầu tham gia cuộc thi lập trình đội nhóm, dù không phải là người có điểm số thấp nhất trong đội và cũng không phải người thứ hai thấp nhất, nhưng xét về vị trí của mình trong đội thì vẫn còn kéo chân. Quên sao chép đề bài rồi, chỉ còn lại lời giải cho sự kiện. Đề bài sẽ bổ sung sau khi có cơ hội.

Ban đầu định chỉ dùng trang web để gỡ lỗi, nhưng vì trang web gặp vấn đề không thể sử dụng được nên đã mở PyCharm.

Bài học rút ra:

  1. Người yếu cần luyện tập nhiều hơn, đạt được một mức điểm phù hợp với năng lực bản thân.
  2. Sử dụng Python = Hết Thời Gian (TLE), tất cả các lời giải xuất hiện trong bài viết này đều bị TLE và không đạt điểm tối đa.
  3. Theo như các cao thủ trên Zhihu nói, việc sử dụng Python trong cuộc thi này dễ bị kẹt do tính toán thường xuyên, PTA cũng không hỗ trợ PyPy. Học được bài học này, năm tới chắc chắn sẽ không dùng Python nữa.
  4. Mở sẵn IDE trước khi thi: Gỡ lỗi trên website không chắc chắn sẽ hoạt động tốt.
  5. Không uống nước trước khi thi: Cuộc thi lần này bắt đầu chậm một giờ và kéo dài thêm một giờ, điều này thực sự là thử thách lớn đối với tâm lý và bàng quang của thí sinh.

Mỗi đoạn mã code bắt đầu bằng chú thích ý nghĩa: {điểm thực tế}/{tổng điểm của câu hỏi}.


L1-1

Đề bài đơn giản.

1
2
# 5/5  
print("Luôn viết code như thể người bảo trì code của bạn sau này sẽ là một kẻ tâm thần bạo lực biết chỗ bạn ở.")  

L1-2

Đề bài đơn giản.

1
2
3
# 5/5  
a, b, c = map(int, input().split())  
print(a + b + c)  

L1-3

Hiểu rõ yêu cầu bài toán.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 10/10  
T, S, t = map(int, input().split())  
if T > 35 and t >= 33:  
  if S == 0:  
    print("Shi Nei")  
    print(T)  
  else:  
    print("Bu Tie")  
    print(T)  
else:  
  if S == 1:  
    print("Bu Re")  
    print(t)  
  else:  
    print("Shu Shi")  
    print(t)  

L1-4

Chuyển đổi sang nhị phân, giữ lại bit cao nhất là 1, xóa hết các bit khác thành 0, sau đó chuyển đổi ngược lại sang thập phân và in kết quả.

1
2
# 10/10  
print(int("1" + (len(bin(int(input()))[2:]) - 1) * "0", 2))  

L1-5

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 15/15  
s = input()  
l = list(map(int, input().split()))  
charmap = {}  
sum = 0  
for c in s:  
  sum += l[ord(c) - ord("a")]  
  if c in charmap:  
    charmap[c] += 1  
  else:  
    charmap[c] = 1  
# Khi thi bị tắc não, có thể trực tiếp dùng vòng lặp sau đây  
# for i in range(ord('a'), ord('z')):  
for i in ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y']:  
  if i in charmap:  
    print(charmap[i], end=" ")  
  else:  
    print(0, end=" ")  
# Không được phép có khoảng trắng cuối dòng, kiểm tra riêng biệt  
if "z" in charmap:  
  print(charmap["z"])  
else:  
  print(0)  
print(sum)  

L1-6

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 10/15  
N, M = map(int, input().split())  
# Một số hành động cần xử lý chuỗi, một số cần danh sách  
# Xử lý trước thành danh sách, khi cần chuyển đổi thành chuỗi cũng gây ra TLE và mất 5 điểm  
alist_str = input()  
for _ in range(M):  
  action = int(input())  
  if action == 1:  
    llist = input()  
    llist_str = llist[llist.find(" ") + 1 :]  
    llist2 = input()  
    llist2_str = llist2[llist2.find(" ") + 1 :]  
    if llist_str in alist_str:  
      alist_str = alist_str.replace(llist_str, llist2_str, 1)  
  elif action == 2:  
    new_alist = []  
    b = None  
    for i in map(int, alist_str.split()):  
      if b is None:  
        b = i  
        continue  
      if (b + i) % 2 == 0:  
        new_alist.append(b)  
        new_alist.append(int((b + i) / 2))  
        b = i  
      else:  
        new_alist.append(b)  
        b = i  
    new_alist.append(b)  
    alist_str = " ".join(map(str, new_alist))  
  else:  
    index_s, index_e = map(int, input().split())  
    alist = list(map(int, alist_str.split()))  
    alist = (  
      alist[: index_s - 1] + alist[index_s - 1 : index_e][::-1] + alist[index_e:]  
    )  
    alist_str = " ".join(map(str, alist))  
print(alist_str)  

L1-7

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 19/20  
n = int(input())  
s = 0  
c = 31  
nn = 1  
flag = False  
passflag = False  
while True:  
  if not passflag:  
    if 1 + 2**c > n:  
      s = 0  
      c -= 1  
      nn = 1  
      if c == 0:  
        break  
      passflag = False  
      continue  
    else:  
      passflag = True  
  s += nn**c  
  if s < n:  
    nn += 1  
  elif s == n:  
    flag = True  
    break  
  else:  
    s = 0  
    c -= 1  
    nn = 1  
    passflag = False  
    continue  
if flag:  
  for i in range(1, nn):  
    print(f"{i}^{c}+", end="")  
  print(f"{nn}^{c}")  
else:  
  print(f"Không thể tìm thấy đáp án cho {n}.")  

L1-8

Tìm giá trị lớn nhất trong mỗi hàng (hoặc cột) và lưu trữ vào mảng line_max. Duyệt qua mảng line_max theo thứ tự giảm dần giá trị, đồng thời ghi lại số hàng và cột tương ứng, bỏ qua nếu chúng trùng nhau.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 15/20  
n, m, k = map(int, input().split())  
mm = [[[0] for _ in range(m)] for _ in range(n)]  
line_max = []  
# Đọc dữ liệu và tiền xử lý để tìm giá trị mục tiêu lớn nhất trong mỗi hàng  
for _ in range(n):  
  mm[_] = list(map(int, input().split()))  
  max_n = "-INF"  
  l = -1  
  for index, n in enumerate(mm[_]):  
    if max_n == "-INF" or n > max_n:  
      max_n = n  
      l = index  
  line_max.append((max_n, _, l))  
c = 0 # Số lượng công kích hiện tại  
dead_h = set() # Lưu trữ số hàng đã phá hủy  
dead_l = set() # Lưu trữ số cột đã phá hủy  
for point in sorted(line_max, key=lambda a: a[0], reverse=True):  
  if c == k:  
    # Đạt giới hạn số lượng công kích  
    break  
  # Kiểm tra số hàng và cột đã tồn tại hay chưa  
  if point[1] in dead_h:  
    continue  
  if point[2] in dead_l:  
    continue  
  c += 1  
  # Lưu trữ số hàng và cột  
  dead_h.add(point[1])  
  dead_l.add(point[2])  
# In kết quả bỏ qua các hàng và cột đã phá hủy  
new_mm = []  
for index, h in enumerate(mm):  
  if index in dead_h:  
    continue  
  temp_h = []  
  for index_2, l in enumerate(h):  
    if index_2 in dead_l:  
      continue  
    temp_h.append(l)  
  new_mm.append(temp_h)  
for _ in new_mm:  
  print(" ".join(map(str, _)))  

L2-1

Chuyển đổi biểu thức từ dạng trung tố sang hậu tố, sau đó in ra quá trình tính toán mà không hiển thị các con số trong quá trình đó. Do quên cách làm, phải suy luận lại và cuối cùng dẫn đến vài trường hợp bị TLE.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 15/25  
s = input()  
pc = []  
temp = []  
sign = ["*", "/", "+", "-"]  
end = []  
ihave_left = 0  
for _ in s:  
  if _ not in sign:  
    if _ not in ["(", ")"]:  
      pc.append(_)  
      if ihave_left == 0:  
        pc.append(temp.pop())  
      continue  
    if _ == ")":  
      ihave_left -= 1  
      pc.append(temp.pop())  
      pc.append(")")  
      continue  
    if _ == "(":  
      pc.append("(")  
      ihave_left += 1  
      continue  
  else:  
    if pc[-1] in sign and (pc[-1] in ("+", "-") and _ in ("*", "/")):  
      temp.append(pc.pop())  
    temp.append(_)  
while temp:  
  pc.append(temp.pop())  
ca_list = []  
for _ in pc:  
  if _ in ("(", ")"):  
    continue  
  if _ in sign:  
    b, b_s = ca_list.pop()  
    a, a_s = ca_list.pop()  
    print(f"{a if a_s==0 else ''}{_}{b if b_s==0 else ''}")  
    ca_list.append((str(eval(f"{a}{_}{b}")), 1))  
  else:  
    ca_list.append((_, 0))  

L2-2

Kiểm tra toàn diện.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 16/25  
from functools import cmp_to_key  
n = int(input())  
g0 = set()  
g1 = set()  
g2 = set()  
for _ in range(n):  
  x, y = list(map(int, input().split()))  
  if y == 0:  
    g0.add(x)  
  elif y == 1:  
    g1.add(x)  
  else:  
    g2.add(x)  
ans = []  
for x1 in g0:  
  for x2 in g1:  
    x3 = x2 + (x2 - x1)  
    if x3 in g2:  
      ans.append([x1, x2, x3])  

def cmp(a, b):  
  if a[1] < b[1]:  
    return -1  
  elif a[1] > b[1]:  
    return 1  
  else:  
    if a[0] < b[0]:  
      return -1  
    elif a[0] > b[0]:  
      return 1  
    else:  
      return 0  

ans.sort(key=cmp_to_key(cmp))  
if not ans:  
  print(-1)  
else:  
  for a in ans:  
    x1, x2, x3 = a  
    print(f"[{x1}, 0] [{x2}, 1] [{x3}, 2]")  

Các Bài Khác

L2-3 dự định đọc toàn bộ dữ liệu thời gian và chia thành các phần để đánh giá, nhưng chưa hoàn thành. L2-4 đang viết dở.

Thời gian không hợp lý, cuối cùng chọn phương án 4 trong các lựa chọn sau:

  1. Tối ưu hóa các bài trước.
  2. Chuyển sang viết bằng C++.
  3. Lấy điểm thấp.
  4. Viết thêm một bài.

Kết quả cho thấy đây là lựa chọn tồi tệ nhất.


Kết Luận

Tổng điểm cuối cùng là 120, điểm hiệu lực cá nhân là 120. Đội trưởng đã giúp đỡ rất nhiều, tổng điểm đội đạt 1457.


Bài Viết Liên Quan

2024-09-16 Hrbust ACM Tập Luyện Tuần 4 Năm 2024 Hướng Dẫn Giải (A-G,J-O)
2024-09-09 Hrbust ACM Tập Luyện Tuần 3 Năm 2024 Hướng Dẫn Giải
2024-09-02 Hrbust ACM Tập Luyện Tuần 1-2 Năm 2024 Hướng Dẫn Giải

Trước đó: Hướng Dẫn Sử Dụng Giao Diện higan-hz
Sau đó: Công Cụ Phân Tích Lượng Truy Cập Umami Phiên Bản Tuân Thủ Luật Tại Trung Quốc


Theme là higan-hz Powered by Halo Pro © 2025 Trang Web Cá Nhân Của HowieHz

Built with Hugo
Theme Stack thiết kế bởi Jimmy