2025年度第六届全国大学生算法设计与编程挑战赛(春季赛)[往届真题训练一] E-I 题解报告

前言

在这里插入图片描述


题解

2025年度第六届全国大学生算法设计与编程挑战赛(春季赛)[往届真题训练一] E-I

主要是测试AI大模型


E. 倒水

在这里插入图片描述

思路: 分类讨论

若 大水缸的 T 在其他 最小温度和最大温度之间,则必然无解

那只有两种情况

  1. 一种为 T 比 所有水杯温度 t i t_i ti小, 这种情况,其实只有 m i n T i {min T_i} minTi 这种情况
  2. 另一种为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 去。

还是非常的优秀的,太赞.


写在最后

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值