USACO January 2014 Bronze Level

本文记录了作者使用Python语言参与USACO 2014 Bronze Level比赛的经历。通过解决A、B、C三个题目,展示了Python在解决枚举和模拟问题上的应用。A题通过枚举找到结果区间,B题进行纯正的模拟判断,C题利用深度搜索和枚举求解最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当时没参加silver的比赛,今天就只是想熟悉一下python的语法(以前都用最熟悉的C++写),于是水了一下Bronze level的题目。


A:最后的结果肯定是在[begin, begin+17]的某个区间里,考虑到begin的可能取值很小,枚举即可。


reader = file('skidesign.in', 'r')
writer = file('skidesign.out', 'w')
N = int(reader.readline())
hill = []
for i in range(N):
    hill.append(int(reader.readline()))
result = 10**8
begin = min(hill)
end = max(hill)
# enumerate all cases
for i in range(begin, end+1):
    cur = 0
    for h in hill:
        if h<i:
            cur += (h-i)**2
        elif h>(i+17):
            cur += (h-i-17)**2
    result = min([result, cur])
writer.write(str(result))


B: 纯正的模拟题目,判断下一步对应的事件就可以了。


reader = file('slowdown.in', 'r')
writer = file('slowdown.out', 'w')
N = int(reader.readline())
time = []
dis = []
cur_time = 0.0
cur_dis = 0.0
speed_inv = 1
res = 0.0
for i in range(N):
    tmp = reader.readline().split()
    if tmp[0]=='T':
        time.append(int(tmp[1]))
    else:
        dis.append(int(tmp[1]))
time.sort()
dis.sort()
time_len = len(time)
dis_len = len(dis)
ptr1 = 0
ptr2 = 0
while ptr1<time_len or ptr2<dis_len:
    if ptr1<time_len:
        time1 = time[ptr1]
    else: time1 = 99999999
    if ptr2<dis_len:
        time2 = cur_time+(dis[ptr2]-cur_dis)*speed_inv
    else: time2 = 99999999
    if time1<time2:
        cur_dis += ((time1-cur_time)*1.0)/speed_inv
        res = time[ptr1]
        cur_time = time[ptr1]
        ptr1 += 1
        speed_inv += 1
    else:
        cur_dis = dis[ptr2]
        res = time2
        cur_time = time2
        ptr2 += 1
        speed_inv += 1
if cur_dis<1000:
    cur_time += (1000-cur_dis)*speed_inv
writer.write(str(int(round(cur_time))))


C: 看上去挺难的。。。但是数据范围很小,借助于深度搜索,枚举每一种可能的组合,取出其中的最优值即可。


reader = file('bteams.in', 'r')
writer = file('bteams.out', 'w')
teams = []
skill = []
result = 0

# just enumerate every possible cases
def dfs(pos):
    global result, teams, skill
    # check if it is a better solution
    if pos == 12:
        acc = []
        for team in teams:
            acc.append(sum(team))
        cur = max(acc)-min(acc)
        result = min([cur, result])
        return
    # use recursion technique to search
    for i in range(4):
        if len(teams[i]) < 3:            
            #print 'here: '+str(i)
            teams[i].append(skill[pos])
            dfs(pos+1)
            teams[i].pop()
    return

for i in range(4):
    teams.append([])
print len(teams)
for i in range(12):
    skill.append(int(reader.readline()))
skill.sort()
#print len(skill)
teams[0].append(skill[0])
result = sum(skill)
dfs(1)
writer.write(str(result))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值