2025第四届大学生算法挑战赛 赛前测试赛 题解

前言


题解

测试考场【算法编程赛道】2025第四届大学生算法挑战赛

继续用Deepseek进行求解,还是非常丝滑。


A. 追债之旅

思路: 图论 + bfs题

利用deepseek,直接给出答案

感觉deepseek在输入输出上,显得有些啰嗦。

python3 复制代码
# coding=utf-8
import heapq

def solve():
    import sys
    input = sys.stdin.read
    data = input().split()
    idx = 0
    n = int(data[idx])
    idx += 1
    m = int(data[idx])
    idx += 1
    k = int(data[idx])
    idx += 1
    
    adj = [[] for _ in range(n + 1)]
    for _ in range(m):
        u = int(data[idx])
        idx += 1
        v = int(data[idx])
        idx += 1
        w = int(data[idx])
        idx += 1
        adj[u].append((v, w))
        adj[v].append((u, w))
    
    a = list(map(int, data[idx:idx + k]))
    idx += k
    
    INF = float('inf')
    dp = [[INF] * (n + 1) for _ in range(k + 1)]
    dp[0][1] = 0
    
    heap = []
    heapq.heappush(heap, (0, 0, 1))  # (total_cost, day, city)
    
    found = False
    min_total = INF
    
    while heap:
        total_cost, day, u = heapq.heappop(heap)
        if u == n:
            min_total = min(min_total, total_cost)
            found = True
            continue
        if day == k:
            continue
        if total_cost > dp[day][u]:
            continue
        for (v, w) in adj[u]:
            new_day = day + 1
            if new_day > k:
                continue
            new_total = total_cost + w + a[day]
            if new_total < dp[new_day][v]:
                dp[new_day][v] = new_total
                heapq.heappush(heap, (new_total, new_day, v))
    
    if found:
        print(min_total)
    else:
        print(-1)

solve()

B. 单词分类

思路: 对每个单词的字母频率进行统计,构建一个feature key

python3 复制代码
# coding=utf-8


n = int(input())

from collections import Counter

st = set()
for _ in range(n):
    s = input()
    cnt = Counter(s)
    z = list(cnt.items())
    z.sort(key=lambda x: (x[0], x[1]))
    k = ""
    for (i, j) in z:
        k += str(i) + ":" + str(j) + ","
    st.add(k)

print (len(st))

C. 梯形面积

S = ( u + d ) ∗ h / 2 S = (u + d) * h / 2 S=(u+d)∗h/2

python3 复制代码
u, d, h = list(map(int, input().split()))

print ("%.3f" % ((u + d)/ 2.0 * h))

D. 好串

等价变化:堆栈模拟, a等价push,b等价于pop

保证栈不存在pop空的操作,同时最后栈为空

python3 复制代码
s = input()

def solve(s):
    r = 0
    for c in s:
        if c == 'a': r+=1
        else:
            r-=1
            if r < 0: return False
    return r == 0


print ("Good" if solve(s) else "Bad")

E. 展览

省流题意: 给你一个数组,任意取几个元素,使得其异或值最大

线性基的板子题

想到了线性基,但代码还是借助deepseek来提供。

python3 复制代码
# coding=utf-8

def insert(x, basis):
    for i in range(63, -1, -1):
        if (x >> i) & 1:
            if basis[i] == 0:
                basis[i] = x
                break
            x ^= basis[i]
    return basis

n = int(input())
arr = list(map(int, input().split()))
basis = [0] * 64

for v in arr:
    insert(v, basis)

def get_max_xor(basis):
    res = 0
    for i in range(63, -1, -1):
        if (res ^ basis[i]) > res:
            res ^= basis[i]
    return res

print (get_max_xor(basis))

写在最后

相关推荐
呆呆的小鳄鱼22 分钟前
leetcode:冗余连接 II[并查集检查环][节点入度]
算法·leetcode·职场和发展
墨染点香22 分钟前
LeetCode Hot100【6. Z 字形变换】
java·算法·leetcode
沧澜sincerely23 分钟前
排序【各种题型+对应LeetCode习题练习】
算法·leetcode·排序算法
CQ_071223 分钟前
自学力扣:最长连续序列
数据结构·算法·leetcode
弥彦_39 分钟前
cf1925B&C
数据结构·算法
YuTaoShao1 小时前
【LeetCode 热题 100】994. 腐烂的橘子——BFS
java·linux·算法·leetcode·宽度优先
Wendy14419 小时前
【线性回归(最小二乘法MSE)】——机器学习
算法·机器学习·线性回归
拾光拾趣录9 小时前
括号生成算法
前端·算法
渣呵10 小时前
求不重叠区间总和最大值
算法
拾光拾趣录10 小时前
链表合并:双指针与递归
前端·javascript·算法