当时没参加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))