2014 Qualification Round Solutions

2013年11月25日下午 1:34

。。。最简单的一题又有bug。。。自以为是真是很厉害!

1. Square Detector (20 Points)

When facing a problem in a programming contest there are three main things to consider when planning your solution. In order of importance:

  1. Is the algorithm correct.
  2. Is the algorithm fast enough.
  3. Is the algorithm easy to implement.

In this particular problem the first two points are rather straightforward, the task is conceptually simple and with the small input size efficiency is not a big concern.

The third point however deserves some consideration, I'm sure you are well aware that it's easy to make bugs in any piece of code you write, and chances for having bugs increase sharply with the code lengths and complexity. That's why it's worth to spend couple extra minutes to think about an approach that yields the least complicated code.

One clever way of solving this is to realize that if you take the bounding box of all the black cells all you need to check is that it's a square and that all the cells inside it are black. Since we are talking about the bounding box another way of stating the second condition is that: total number of black cells is equal to the area of our box.

With that observation the whole algorithm can be expressed with just these simple steps:

  1. Find the minimum and maximum X coordinate of all the black cells. The same for Y values
  2. Count all the black cells
  3. Check if maxX - minX == maxY - minY
  4. Check if the area: (maxX - mniX +1)^2 is equal to the count from step 2
  5. Profit!

A solution like that leaves much less room for an error than solutions with higher number of conditions to check, like for example finding segments in each row and then figuring out if they add up to a square. Here is an example python implementation:

def solve():

n = int(raw_input().strip())

b = [raw_input().strip() for i in range(n)]

black = 0

minX, maxX, minY, maxY = n, 0, n, 0

for x in range(0, n) :

for y in range(0, n) :

if b[x][y] == '#':

minX, minY  = min(minX, x), min(minY, y)

maxX, maxY = max(maxX, x), max(maxY, y)

black += 1

dx = maxX - minX + 1

dy = maxY - minY + 1

return dx == dy and dx * dy == black

if __name__ == '__main__':

t = int(raw_input().strip())

for i in range(1, t+1):

res = solve()

print 'Case #%d: %s' % (i, 'YES' if res else 'NO')

Another idea of a very inefficient, but easy to implement algorithm is that you can iterate over all the possible grid formations that form a square, there is an order of N^3 of them. Now all you need to check is whether one of the grids matches your input exactly!

Finally with 20 cases and 5 minutes to upload the output, you can actually detect the squares by reading the input file with your own pair eyes :)

2. Basketball Game (35 Points)

Similarly to the previous problem the solution doesn't require fancy algorithm, and the execution speed is not a problem. You can basically solve it by translating the statement step by step into code to simulate what happens during the game.

The main difficulty in doing that is figuring out how to store and manipulate the state for each of the players. There are multiple pieces of information associated with a player: her name, height, shot accuracy, draft number, minutes played, and whether she's currently on the bench. With all that it might be useful to encapsulate it in a structure. I chose to have a Player class that stores all the aforementioned data. With that out of the way the solution can be done in three steps:

Step 1: Calculate draft numbers and split into teams

The easiest way to achieve this is to sort all the players by the defined criteria and then the 1-base index of a player in the sorted array is equal to the draft number of that player. Sorting things by various criteria is an often encountered operation in programming competitions so it's worth knowing how to do it in your language of choice. For example in python you can do it by passing a lambda function for key calculation, like this:

players.sort(key = lambda p: (p.perc, p.height), reverse=True)

for idx, player in enumerate(players):

player.draft = idx + 1

player.onField = idx < 2 * P

teamA = filter(lambda t: t.draft % 2 == 1, players)

teamB = filter(lambda t: t.draft % 2 == 0, players)

Step 2: Simulate a minute of the game and the rotation

Again we want to perform exactly what the problem statement asks us to. That is find the player with the most play time currently on the field and the player with the least play time from the bench. We can again use a lambda function together with min/max functions to achieve that.

def field(team): return filter(lambda p: p.onField, team)

def bench(team): return filter(lambda p: not p.onField, team)

def play(team):

for player in field(team): player.timePlayed += 1

def rotate(team):

max(field(team), key = lambda p: (p.timePlayed, p.draft)).onField = False

min(bench(team), key = lambda p: (p.timePlayed, p.draft)).onField = True

There is one subtlety in the rotate function above. It adds the player to the bench before selecting the player to join the field so it looks like it could allow for a player to leave and immediately come back. In practice this can never happen (for teams with more than P players) but if you are not convinced and don't feel like proving it just use a temporary variable rather than changing the state right away.

Step 3: Get the state after M minutes and print the result

After repeating the previous step M times there is one final thing to do. Find the players on the field and print out sorted list of names:

res = map(lambda p: p.name, field(teamA) + field(teamB))

print(" ".join(sorted(res)))

A final Note on the language selection, I've chosen Python for the examples because I enjoy the brevity and clarity it can offer. The problem can of course be solved in a more imperative way just fine. In the future rounds we might face more computationally heavy problems where benefits of a faster language like C++ can outweigh the elegance of Python.

3. Tennison (45 Points)

Let F(w, l, p) be the probability that Tennison the match given that he has already won w games, lost l games, and the probability of sun is currently p. Our answer will then be F(0, 0, pi).

First, the base cases. If you've already won K or lost K games, the match is over:

F(K, l, p) = 1.0

F(w, K, p) = 0.0

For each match, it can be sunny or rainy, Tennison can win or lose, and the weather can change or stay the same. That gives us 23 = 8 possible outcomes. Our answer will be the sum across all of these outcomes. The probability of each outcome is just the product of the probability of the 3 individual events.

F(w, l, p) =

p       * ps       * pw       * F(w + 1, l,     p + pu) +

p       * ps       * (1 - pw) * F(w + 1, l,     p     ) +

p       * (1 - ps) * pl       * F(w,     l + 1, p - pd) +

p       * (1 - ps) * (1 - pl) * F(w,     l + 1, p     ) +

(1 - p) * pr       * pw       * F(w + 1, l,     p + pu) +

(1 - p) * pr       * (1 - pw) * F(w + 1, l,     p     ) +

(1 - p) * (1 - pr) * pl       * F(w,     l + 1, p - pd) +

(1 - p) * (1 - pr) * (1 - pl) * F(w,     l + 1, p     )

If p is ever greater than 1, or less than 0, it's important to remember to cap it to the range [0, 1].

We need to memoize our results to have this solution run in time, but that might appear awkward since one of the inputs to F, p is a fraction. However, the probabilities are only given to 3 decimal places so it suffices to represent p as an integer in the range [0, 1000].

w and l can each be as large as K, and p can be as large as 1000, so the worst-case running time is proportional to 1000 * K2, which is 107.

Facebook Hacker Cup 2014 Qualification Round的更多相关文章

  1. Facebook Hacker Cup 2014 Qualification Round 竞赛试题 Square Detector 解题报告

    Facebook Hacker Cup 2014 Qualification Round比赛Square Detector题的解题报告.单击这里打开题目链接(国内访问需要那个,你懂的). 原题如下: ...

  2. DP VK Cup 2012 Qualification Round D. Palindrome pairs

    题目地址:http://blog.csdn.net/shiyuankongbu/article/details/10004443 /* 题意:在i前面找回文子串,在i后面找回文子串相互配对,问有几对 ...

  3. 51Nod 1182 完美字符串(字符串处理 贪心 Facebook Hacker Cup选拔)

    1182 完美字符串             题目来源:                         Facebook Hacker Cup选拔         基准时间限制:1 秒 空间限制:1 ...

  4. Facebook Hacker Cup 2015 Round 1--Corporate Gifting(树动态规划)

    原标题:https://www.facebook.com/hackercup/problems.php?pid=759650454070547&round=344496159068801 题意 ...

  5. Facebook Hacker Cup 2015 Round 1--Winning at Sports(动态规划)

    原题:pid=688426044611322&round=344496159068801">https://www.facebook.com/hackercup/problem ...

  6. Facebook Hacker Cup 2015 Round 1--Homework(筛选法求素数)

    题意:给定A,B,K(A<=B)三个数,问在[A,B]范围内的数素数因子个数为K的个数. 题解:典型的筛选法求素数.首先建立一个保存素数因子个数的数组factorNum[],以及到n为止含有素数 ...

  7. VK Cup 2012 Qualification Round 1 C. Cd and pwd commands 模拟

    C. Cd and pwd commands Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset ...

  8. VK Cup 2012 Qualification Round 2 C. String Manipulation 1.0 字符串模拟

    C. String Manipulation 1.0 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 codeforces.com/problemset/pr ...

  9. VK Cup 2012 Qualification Round 1---C. Cd and pwd commands

    Cd and pwd commands time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

随机推荐

  1. Segmentation

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION There is another way ...

  2. OpenMP for Fortran

    OpenMP for Fortran OpenMP Directive Syntax of OpenMP compiler directive for Fortran: !$OMP Directive ...

  3. ucenter小结

    经历了一天的折腾,大概搞清楚的ucenter接入应用的方法.总结如下: 一.下载安装ucenter.这个很简单. 二.然后就是接入应用. 1.先在你项目的根目录copy一份uc_client文件夹. ...

  4. 【转】javascript中this的四种用法

    在函数执行时,this 总是指向调用该函数的对象.要判断 this 的指向,其实就是判断 this 所在的函数属于谁. 在<javaScript语言精粹>这本书中,把 this 出现的场景 ...

  5. 20145319 《java程序设计》课程总结

    20145319 <Java程序设计>课程总结 读书笔记链接总结 - 20145319 第一周学习总结 - 20145319 第二周学习总结 - 20145319 第三周学习总结 - 20 ...

  6. 基于vs2005以上版本Qt程序发布的注意事项(讲了manifest的问题)

    最近发现了一个非常恼人的程序deployment的问题,估计大家有可能也会遇到,特此memo. 问题的出现我觉得主要还是微软搞的花头太多, 一个不知所谓的manifest文件让本来简单的程序发布变得困 ...

  7. Python 链接Mysql数据库

    参考链接:https://pypi.python.org/pypi/PyMySQL#downloads import pymysql.cursors,xml.dom.minidom # Connect ...

  8. ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件

    原文:ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件 先看效果图,然后上代码: <UserControl x:Class= ...

  9. 如何解决jQuery Validation针对动态添加的表单无法工作的问题?

    为了充分利用ASP.NET MVC在服务端呈现HTML的能力,在<利用动态注入HTML的方式来设计复杂页面>一文中介绍了,通过Ajax调用获取HTML来呈现复杂页面中某一部分界面的解决方案 ...

  10. 获取设备的唯一标识uuid

    摘自:http://blog.sina.com.cn/s/blog_5971cdd00102vqgy.html -(NSString*) uuid { CFUUIDRef puuid = CFUUID ...