2017Megcup

2017Megcup决赛第三题题解

赛题评论

只做出了一道题,虽然慢慢地退出了前128名,但还是要记录一下。

10点钟开始,一看第一题很熟悉,因为研究过格点图中电流问题,其实就是求解线性方程组。上来就编,用Python,用numpy解方程,比较难于描述,编程水平也太差劲,好久不编手生得很。磨磨蹭蹭直到2:19才成功解决。这是排名90名左右,但是因为这道题做出来的人太多,也就不太值钱了,所以我一直在退步。以后也再没过题,直到比赛即将结束前的三四个小时,退出了前128名,榜上无名了。

什么叫做能力?能力就是比赛时的状态,就看第一次遇到问题时的反应。人跟人的差距简直就是天壤之别。人与人之间智商的差距之悬殊,不亚于人与人体型大小之悬殊。想想那些2米多的大高个,想想1米七多点的自己。

开始做第二题DogFood,我一开始觉得应该是暴力,枚举1e8个点,用python写,用sklearn的kdtree,结果太慢了,运行出结果大约需要5分钟,并且结果太不精确。我就想别人用的什么妙招。。。很纠结。

直到比赛结束,看到一大群人都是暴力,就连求第k近邻都是暴力,没有使用KD树,只不过用的是C++,估计会快得多。真后悔没有用C++暴力一下。

开始做Error++,这道题不会做,也没思路。就是瞎编

林教主誓死要拿下锈规作图,我也开始看这道题。读Matrix大神博客,懂了,编不出来。知道第二天花了整整一天时间才怼出来了这道题。

这次比赛的奖金分配、计分规则非常新颖,用一个图的形式形象的描述了分数的计算方式。

这种计算方式有如下特点:

  • 一道题,做出来的人越少,这些人越能分到更多的流量
  • 流量延时,比赛结束之后,流量还在计算着,需要等10h之后再看积分

解法:

这个问题其实就是解线性方程组,每个结点的流入量与流出量相等。

对于N个结点,分别对每个结点列方程,可以很容易列出N个线性方程来

但是,这N个线性方程组的秩必然是N-1

还要添加一个条件:各个节点的硬币之和为(人题数)

我的做法是,不对中心节点列方程(毕竟它有一条自回路,处理略麻烦),添加“硬币之和”条件

解此线性方程组即可

这么简单的问题,我竟然做了将近4个半小时,真是老了

转念一想,我年轻时也不咋地

  1. import math
  2. import numpy as np
  3. solved = [0] * 8 # 第i题解决的人数
  4. person_id_map = dict() # 将人名映射到id
  5. data = []
  6. g = None # 图136+9个结点
  7. gsize = None
  8. score = None # 当前分数
  9. sum_score = None # 分数积分
  10. # 构图
  11. def submit(person_id, q):
  12. solved[q] += 1
  13. for i in range(9, gsize):
  14. if g[q][i]:
  15. g[q][i] = 1 / solved[q]
  16. g[q][person_id] = 1 / solved[q]
  17. g[person_id][q] = 1
  18. g[8][q] += 1
  19. g[q][8] += 1 / solved[q]
  20. def getOutSum(pos):
  21. s = 0
  22. for i in range(gsize):
  23. s += g[pos][i]
  24. return s
  25. def equation():
  26. a, b = [], []
  27. # o表示各个结点流出流量之和
  28. o = [0] * gsize
  29. for i in range(gsize):
  30. o[i] = getOutSum(i)
  31. for i in range(gsize):
  32. if i == 8: continue
  33. if not o[i]: continue
  34. row = []
  35. for j in range(gsize):
  36. if not o[j]: continue
  37. if i == j:
  38. row.append(1)
  39. else:
  40. row.append(-g[j][i] / o[j])
  41. a.append(row)
  42. b.append(0)
  43. a.append([1] * len(a[0]))
  44. b.append(sum(solved))
  45. ans = np.linalg.solve(a, b)
  46. ansi = 0
  47. for i in range(gsize):
  48. if o[i]:
  49. score[i] = ans[ansi]
  50. ansi += 1
  51. else:
  52. score[i] = 0
  53. def accumulate(dt):
  54. for i in range(gsize):
  55. sum_score[i] += score[i] * dt
  56. def load():
  57. global gsize
  58. gsize = 9
  59. # 读入数据,处理
  60. for line in open("in.txt", encoding="utf8"):
  61. if not line: continue
  62. t, person, q = line.split()
  63. t = float(t)
  64. q = int(q)
  65. if person not in person_id_map:
  66. person_id_map[person] = gsize
  67. gsize += 1
  68. person_id = person_id_map[person]
  69. data.append((t, person_id, q))
  70. def init():
  71. global g, score, sum_score
  72. g = [[0 for _ in range(gsize)] for __ in range(gsize)]
  73. g[8][8] = 1
  74. score = [0] * gsize
  75. sum_score = [0] * gsize
  76. def people():
  77. ans = []
  78. for name, person_id in person_id_map.items():
  79. ans.append((name, sum_score[person_id]))
  80. ans.sort(key=lambda x: -x[1])
  81. return ans
  82. def main():
  83. for i in range(len(data)):
  84. if i > 0:
  85. accumulate(data[i][0] - data[i - 1][0])
  86. submit(data[i][1], data[i][2])
  87. equation()
  88. accumulate(3600 * 22 - data[len(data) - 1][0])
  89. def getStandard(a):
  90. sz = min(len(a), 32)
  91. mean = sum([a[i][1] for i in range(sz)]) / sz
  92. sq = sum([(a[i][1] - mean) ** 2 for i in range(sz)]) / sz
  93. return math.sqrt(sq)
  94. def output(a):
  95. s = getStandard(a)
  96. have_money = min(len(a), 32)
  97. percent = [math.exp(a[i][1] / s) for i in range(have_money)]
  98. sum_percent = sum(percent)
  99. for i in range(have_money):
  100. print(i + 1, a[i][0], a[i][1], 88888 * percent[i] / sum_percent)
  101. for i in range(have_money, min(128, len(a))):
  102. print(i + 1, a[i][0], a[i][1], 0)
  103. load()
  104. init()
  105. main()
  106. output(people())

Megcup 2017 决赛第一题 规则的更多相关文章

  1. 携程 决赛 第一题 Crossword

    //真是郁闷的一晚上//比赛时看到这题是就感觉会做,感觉思路清晰 就去准备找第二题 ,因为感觉第二题是个经典问题,(我不会计算几何),就去搜索了下,然后找到求最小面积的,改来改去,一直Wa// 然后就 ...

  2. 第三届蓝桥杯Java高职组决赛第一题

    题目描述: 看这个算式: ☆☆☆ + ☆☆☆ = ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字. 这个算式有多少种可能的正确填写方法? 173 + 286 = 459 295 + 173 = ...

  3. NOIP2010~2017部分真题总结

    NOIP2010~2017部分真题总结 2010 (吐槽)md这个时候的联赛还只有4题吗? 引水入城 只要发现对于有合法解的地图,每个蓄水厂贡献一段区间这个结论就很好做了 那么\(O(n^3)\)对每 ...

  4. 算法笔记_212:第七届蓝桥杯软件类决赛真题(Java语言B组)

    目录 1 愤怒小鸟 2 反幻方 3 打靶 4 路径之谜 5 碱基 6 圆圈舞 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 愤怒小鸟 愤怒小鸟 X星球愤怒的小鸟喜欢撞火车! 一根平直的铁轨上两火车 ...

  5. [算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正

    上一篇的blog地址为:http://www.cnblogs.com/life91/p/3313868.html 这几天又参加了一个家公司的笔试题,在最后的编程题中竟然出现了去哪儿网开发的第一题,也就 ...

  6. 《学习OpenCV》练习题第五章第一题ab

    这道题是载入一幅带有有趣纹理的图像并用不同的模板(窗口,核)大小做高斯模糊(高斯平滑),然后比较用5*5大小的窗口平滑图像两次和用11*11大小的窗口平滑图像一次是否接近相同. 先说下我的做法,a部分 ...

  7. 《学习OpenCV》练习题第四章第一题b&c

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  8. 《学习OpenCV》练习题第四章第一题a

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  9. Google Code Jam 第一题

    通过的第一题,留做纪念,呵呵,非常简单,Africa 2010, Qualification Round: Store Credit. #include <stdio.h> #includ ...

随机推荐

  1. HDU4183 起点到终点再到起点 除起点每点仅经过一次 网络流

    题意: T个测试数据 n个圆 下面 fre x y r 表示圆的频率 坐标和半径 要求: 从频率为400(最小的) 圆 走到频率为789(最大)的圆,再走回来,除起点每个点只能经过一次 问这样的路径是 ...

  2. 使用C#创建及调用WCF完整实例 (Windows服务宿主)

    关于WCF的概念.原理.优缺点等,在这里就不多说了,网上很多,可以自行搜索,比我解释的要专业的多. 这里直接说使用Windows 服务(Windows Service)作为宿主如何实现,其它方式不在此 ...

  3. 【HTML5】实现QQ聊天气泡效果

    今天自己用 HTML/CSS 做了个类似QQ的聊天气泡,以下是效果图: 以下说下关键地方的样式设置.然后贴出html和css代码(不多). 步骤1:布局 消息採用div+float布局,每条消息用一个 ...

  4. COM的一些基本概念

      Windows lets you share code at the binary level using DLLs. After all, that's how Windows apps fun ...

  5. 程序员们必备的10款免费jquery插件

    本周带来10款免费的jquery插件.如果你也有好的作品,欢迎分享到社区中来,在得到帮助的同时,也能与更多人分享来自你的作品. jQuery导航菜单置顶插件 - stickyUp . 在线演示 sti ...

  6. project开发的程序设计与逻辑设计

    非常多时候我们要做庞大project, 就像一棵大树, 方方面面都有自己的细枝末节,而作为开发员的我们,无法时时刻刻去保持对程序的全面认知,所以我们要把程序设计与逻辑设计区分开来. 那么什么是程序设计 ...

  7. Linux下时间格式转换及获取方法

    Linux下使用clock_gettime给程序计时 #include <stdio.h> #include <unistd.h> #include <stdlib.h& ...

  8. Linux集群监控工具简介:Ganglia和Nagios

    11年时候,曾经对 Ganglia 和 Nagios有一定接触,这是两个用于监视数据中心的工具.这两个工具被大量用于高性能计算(HPC)环境中,但是它们对于其他环境也具有很大的吸引力(例如云.呈现集群 ...

  9. 队列实例程序(C语言)

    /* queue.h */ #ifndef _QUEUE_H #define _QUEUE_H struct queue_record; typedef struct queue_record *qu ...

  10. eclipse使用egit插件

    本来想用myeclipse,奈何试过网上所列的常用方法,都无法成功安装egit插件.只得转到eclipse.话说eclipse不仅是免费的,启动也较myeclipse更为迅速,安装插件也非常顺利.使用 ...