#!/usr/bin/python # -*- coding: utf-8 -*- # NOI '08 - Day 2, Problem 3 # Tournament Matching (赛程安排) # # Solution Checker for Experimentation # By Alex Li import math import sys p = [[0]*2000 for _ in xrange(2000)] # win probabilities pos = [[0]*100 for _ in xrange(2000)] # bracket positions slot = [0]*2000 # initial slot placements def calc(l, r, steps): global p, pos, slot if steps == 1: pos[slot[l]][1] = 1 return mid = (l + r) // 2 calc(l, mid, steps - 1) calc(mid + 1, r, steps - 1) for i in xrange(l, mid + 1): for j in xrange(mid + 1, r + 1): pos[slot[i]][steps] += pos[slot[i]][steps - 1]*pos[slot[j]][steps - 1]*p[slot[i]][slot[j]]; pos[slot[j]][steps] += pos[slot[i]][steps - 1]*pos[slot[j]][steps - 1]*p[slot[j]][slot[i]]; for i in xrange(l, r + 1): pos[slot[i]][steps - 1] -= pos[slot[i]][steps] def main(): if len(sys.argv) < 2: sys.exit("Usage: match_check.py ") global p, pos, slot fi = open(sys.argv[1], "r") fi.readline() # discard test case number n = int(fi.readline().strip()) k = int(math.log(n, 2)) for i in xrange(1, n + 1): p[i] = [0] + map(float, fi.readline().strip().split()) a = [0]*2000 # prize values for rounds for i in xrange(1, k + 2): a[i] = int(fi.readline().strip()) fi.close() fo = open(sys.argv[2], "r") for i in xrange(1, n + 1): line = fo.readline() if not line: sys.exit("Format error\nLess than n numbers\n") slot[i] = int(line.strip()) fo.close() xy = [0]*2000 for i in xrange(1, n + 1): if slot[i] > n or slot[i] < 1: sys.exit("Format error\nNot a permutation\n") if xy[slot[i]] > 0: sys.exit("Format error\nNot a permutation\n") xy[slot[i]] = i if slot[1] != 1: sys.exit("Format error\nThe first number isn't 1\n") calc(1, n, k + 1) ans = 0.0 for i in xrange(1, k + 2): ans += pos[1][i] * a[i] print 'OK. Your answer is %.8f.' % ans if __name__ == '__main__': main()