前言
题解
2025年度第六届全国大学生算法设计与编程挑战赛(春季赛)[往届真题训练一] E-I
主要是测试AI大模型
E. 倒水
思路: 分类讨论
若 大水缸的 T 在其他 最小温度和最大温度之间,则必然无解
那只有两种情况
- 一种为 T 比 所有水杯温度 t i t_i ti小, 这种情况,其实只有 m i n T i {min T_i} minTi 这种情况
- 另一种为T 比所有水杯温度 t i t_i ti大,这种情况,下界为 m a x T i { max T_i } maxTi, 上界为T
n = int(input())
t, c = list(map(int, input().split()))
waters = []
for _ in range(n):
waters.append(list(map(int, input().split())))
minT = min([z[0] for z in waters])
maxT = max([z[0] for z in waters])
if minT <= t <= maxT:
print ("Impossible")
exit(0)
def check(x):
acc = 0
for (t1, c1) in waters:
d = (x * c1 - t1 * c1) / (t - x)
acc += d
return acc <= c
l,r = 0, 0
if maxT < t:
l = maxT
r = t
ans = None
while (r - l) >= 1e-6:
m = (l + r) / 2.0
if check(m):
l = m
ans = m
else:
r = m
if ans is None:
print ("Impossible")
else:
print ("Possible")
print ("%.4f" % ans)
else:
if not check(minT):
print ("Impossible")
else:
print ("Possible")
print ("%.4f" % minT)
豆包大模型,给了一个错误解,哭了
F. 纸牌游戏
思路: 二分 + 贪心check
本质就是求最大和最小的k向配对,这样必然作差和最大。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int64_t> arr(n);
vector<int64_t> brr(n);
for (int64_t &x: brr) cin >> x;
for (int64_t &x: arr) cin >> x;
sort(arr.rbegin(), arr.rend());
sort(brr.begin(), brr.end());
int l = 1, r = n;
while (l <= r) {
int m = l + (r - l) / 2;
bool ok = true;
for (int i = 0; i < m; i++) {
if (arr[i] < brr[i]) {
ok = false;
break;
}
}
if(ok) {
l = m + 1;
} else {
r = m - 1;
}
}
int64_t ans = 0;
for (int i = 0; i < r; i++) {
ans += abs(arr[i] - brr[i]);
}
cout << ans << endl;
return 0;
}
豆包大模型给的非常简洁解, 这局完胜
n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
# 对对方的牌升序排序,己方的牌降序排序
a.sort()
b.sort(reverse=True)
score = 0
j = 0 # 己方牌的指针
# 遍历对方的每一张牌(升序),用己方降序的牌尽可能匹配
for num in a:
if j < n and b[j] >= num:
score += b[j] - num
j += 1
print(score)
G题 Light Switching
原题链接: usaco 2008 light switching
一如既往的,赛氪特色,盐都不盐了。
H. DNA
思路: 构造
抓住两个对象线, 同时把末尾的空格trim掉
# coding=utf-8
t = int(input())
for _ in range(t):
if _ > 0: print ()
a, b = list(map(int, input().split()))
for i in range(b):
g = [[' '] * a for _ in range(a)]
for j in range(a):
g[j][j] = 'X'
g[j][a - 1 - j] = 'X'
for j in range(a):
g[j] = ''.join(g[j]).rstrip()
print (*g[:a-1], sep='\n')
print ('X' + (' ' * (a - 2)) + 'X')
I. 委派任务
模拟题
可以利用全枚举,来验证
不过这题非常的有趣,它自己把唯一解,放在case中了,T_T
# coding=utf-8
print ("A,B,C,F,")
豆包大模型,推导得
结论唯一可行的方案是
选派 A、B、C、F 四人,满足所有条件且人数最多。
答案:应让 A、B、C、F 去。
还是非常的优秀的,太赞.