USACO January 2014 Bronze Level

来源:互联网 发布:java泛型方法定义 编辑:程序博客网 时间:2024/06/09 08:05

当时没参加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**8begin = min(hill)end = max(hill)# enumerate all casesfor 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.0cur_dis = 0.0speed_inv = 1res = 0.0for 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 = 0ptr2 = 0while 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 += 1if cur_dis<1000:    cur_time += (1000-cur_dis)*speed_invwriter.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 casesdef 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()    returnfor 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))


0 0