Megcup 2017 决赛第一题 规则
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个半小时,真是老了
转念一想,我年轻时也不咋地
import math
import numpy as np
solved = [0] * 8 # 第i题解决的人数
person_id_map = dict() # 将人名映射到id
data = []
g = None # 图136+9个结点
gsize = None
score = None # 当前分数
sum_score = None # 分数积分
# 构图
def submit(person_id, q):
solved[q] += 1
for i in range(9, gsize):
if g[q][i]:
g[q][i] = 1 / solved[q]
g[q][person_id] = 1 / solved[q]
g[person_id][q] = 1
g[8][q] += 1
g[q][8] += 1 / solved[q]
def getOutSum(pos):
s = 0
for i in range(gsize):
s += g[pos][i]
return s
def equation():
a, b = [], []
# o表示各个结点流出流量之和
o = [0] * gsize
for i in range(gsize):
o[i] = getOutSum(i)
for i in range(gsize):
if i == 8: continue
if not o[i]: continue
row = []
for j in range(gsize):
if not o[j]: continue
if i == j:
row.append(1)
else:
row.append(-g[j][i] / o[j])
a.append(row)
b.append(0)
a.append([1] * len(a[0]))
b.append(sum(solved))
ans = np.linalg.solve(a, b)
ansi = 0
for i in range(gsize):
if o[i]:
score[i] = ans[ansi]
ansi += 1
else:
score[i] = 0
def accumulate(dt):
for i in range(gsize):
sum_score[i] += score[i] * dt
def load():
global gsize
gsize = 9
# 读入数据,处理
for line in open("in.txt", encoding="utf8"):
if not line: continue
t, person, q = line.split()
t = float(t)
q = int(q)
if person not in person_id_map:
person_id_map[person] = gsize
gsize += 1
person_id = person_id_map[person]
data.append((t, person_id, q))
def init():
global g, score, sum_score
g = [[0 for _ in range(gsize)] for __ in range(gsize)]
g[8][8] = 1
score = [0] * gsize
sum_score = [0] * gsize
def people():
ans = []
for name, person_id in person_id_map.items():
ans.append((name, sum_score[person_id]))
ans.sort(key=lambda x: -x[1])
return ans
def main():
for i in range(len(data)):
if i > 0:
accumulate(data[i][0] - data[i - 1][0])
submit(data[i][1], data[i][2])
equation()
accumulate(3600 * 22 - data[len(data) - 1][0])
def getStandard(a):
sz = min(len(a), 32)
mean = sum([a[i][1] for i in range(sz)]) / sz
sq = sum([(a[i][1] - mean) ** 2 for i in range(sz)]) / sz
return math.sqrt(sq)
def output(a):
s = getStandard(a)
have_money = min(len(a), 32)
percent = [math.exp(a[i][1] / s) for i in range(have_money)]
sum_percent = sum(percent)
for i in range(have_money):
print(i + 1, a[i][0], a[i][1], 88888 * percent[i] / sum_percent)
for i in range(have_money, min(128, len(a))):
print(i + 1, a[i][0], a[i][1], 0)
load()
init()
main()
output(people())
Megcup 2017 决赛第一题 规则的更多相关文章
- 携程 决赛 第一题 Crossword
//真是郁闷的一晚上//比赛时看到这题是就感觉会做,感觉思路清晰 就去准备找第二题 ,因为感觉第二题是个经典问题,(我不会计算几何),就去搜索了下,然后找到求最小面积的,改来改去,一直Wa// 然后就 ...
- 第三届蓝桥杯Java高职组决赛第一题
题目描述: 看这个算式: ☆☆☆ + ☆☆☆ = ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字. 这个算式有多少种可能的正确填写方法? 173 + 286 = 459 295 + 173 = ...
- NOIP2010~2017部分真题总结
NOIP2010~2017部分真题总结 2010 (吐槽)md这个时候的联赛还只有4题吗? 引水入城 只要发现对于有合法解的地图,每个蓄水厂贡献一段区间这个结论就很好做了 那么\(O(n^3)\)对每 ...
- 算法笔记_212:第七届蓝桥杯软件类决赛真题(Java语言B组)
目录 1 愤怒小鸟 2 反幻方 3 打靶 4 路径之谜 5 碱基 6 圆圈舞 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 愤怒小鸟 愤怒小鸟 X星球愤怒的小鸟喜欢撞火车! 一根平直的铁轨上两火车 ...
- [算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正
上一篇的blog地址为:http://www.cnblogs.com/life91/p/3313868.html 这几天又参加了一个家公司的笔试题,在最后的编程题中竟然出现了去哪儿网开发的第一题,也就 ...
- 《学习OpenCV》练习题第五章第一题ab
这道题是载入一幅带有有趣纹理的图像并用不同的模板(窗口,核)大小做高斯模糊(高斯平滑),然后比较用5*5大小的窗口平滑图像两次和用11*11大小的窗口平滑图像一次是否接近相同. 先说下我的做法,a部分 ...
- 《学习OpenCV》练习题第四章第一题b&c
#include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...
- 《学习OpenCV》练习题第四章第一题a
#include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...
- Google Code Jam 第一题
通过的第一题,留做纪念,呵呵,非常简单,Africa 2010, Qualification Round: Store Credit. #include <stdio.h> #includ ...
随机推荐
- [MAC OS] NSButton tag 获取
@IBAction func switchContentLayout(_ sender: Any) { let button : NSButton = sender as! NSButton;}
- Python3.6学习笔记(四)
错误.调试和测试 程序运行中,可能会遇到BUG.用户输入异常数据以及其它环境的异常,这些都需要程序猿进行处理.Python提供了一套内置的异常处理机制,供程序猿使用,同时PDB提供了调试代码的功能,除 ...
- sscanf,sprintf用法
#include<string.h> #include<stdio.h> int main() { ],sztime1[],sztime2[]; sscanf("12 ...
- 21.重入锁ReentrantLock
ReentrantLock 重入锁,在需要进行代码同步部分上加锁,但是一定要记得解锁. 类型:公平锁(队列方式进行排队).非公平锁(按照cpu的分配),非公平锁性能要比公平锁性能高,默 ...
- 混沌数学之Rössler(若斯叻)吸引子
若斯叻吸引子(Rössler attractor)是一组三元非线性微分方程: frac{dx(t)}{dt} = -y(t)-z(t) frac{dy(t)}{dt} = x(t)+a*y(t) fr ...
- 基于zabbix的Redis、Sentinel、Slave多实例自动发现监控
约定 保证whereis redis-cli 能够正确返回redis-cli程序的路径 保证 redis的配置文件在模板宏{$REDIS_SERVER_CONFIG_PATH}的路径,并且后缀名 为. ...
- 怎么才能成为一名PHP专家?
本文作者Bruno Skvorc是一名资深的Web开发者.在这篇文章里主要是讲述成为一名专业的PHP专家所要经历的过程,以及在这个过程里要如何学习掌握技巧和对工具的舍取.(以下为编译内容) 当阅读各种 ...
- vue组件级路由钩子函数介绍,及实际应用
正如其名,vue-router 提供的导航钩子主要用来拦截导航,让它完成跳转或取消. 有多种方式可以在路由导航发生时执行钩子:全局的.单个路由独享的.或者组件级的. 一.全局钩子 你可以使用 rout ...
- [Node.js]33. Level 7: Persisting Questions
Let's go back to our live-moderation app and add some persistence, first to the questions people ask ...
- [Node.js]24. Level 5: Express, Express routes
Create an express route that responds to GET requests at the URL /tweets that responds with the file ...