# 买糖果

<题目来源: 京东2016实习生招聘 原题链接-可在线提交(赛码网)>

### 问题描述

a.考虑一种最简单的情况：只有体积为1的糖果。

b.再考虑另外一种罪简单的情况，只有体积为2的糖果。

c.考虑题目既有体积1和2的情况。

…已选择部分…| 体积为2的糖果| …未选择部分…

`` ^已获得的魔幻因子pm ^体积限制v``

i.l和r都不存在

1. = v
ii.l存在，r不存在
2. = max(pm, pm – l + p)

iii.l不存在，r存在

1. = pm + r
iv.l和r都存在
2. = max(pm + r, pm – l + p)

``````import sys

const_n = 0
const_v = 1
const_p = 2

def main():
while True:
n, vm = line[0], line[1]

candies = []
for i in range(n):
if len(line) < 2:
break
candies.append((i + 1, line[0], line[1]))

candies = sorted(candies, key=lambda s: float(s[const_p]) / float(s[const_v]), reverse=True)
# print candies

seq = set([])
v = p = 0
l = r = -1
for i, candy in enumerate(candies):
if v + candy[const_v] >= vm:
if v + candy[const_v] == vm:
p += candy[const_p]
else:
for j in range(i + 1, n):
if candies[j][const_v] == 1:
r = j
break

if l == -1 and r == -1:
pass
elif l == -1 and r != -1:
p += candies[r][const_p]
seq.append(candies[r][const_n])
elif l != -1 and r == -1:
if candy[const_p] - candies[l][const_p] > 0:
p = p - candies[l][const_p] + candy[const_p]
seq.remove(candies[l][const_n])
else:
if candy[const_p] - candies[l][const_p] > candies[r][const_p]:
p = p - candies[l][const_p] + candy[const_p]
seq.remove(candies[l][const_n])
else:
p += candies[r][const_p]
break

v += candy[const_v]
p += candy[const_p]

if candy[const_v] == 1:
l = i

print p
if p > 0:
seq = sorted(seq)
for s in seq:
print s,
else:
print 'No'
print

if __name__ == '__main__':
main()
``````

# 终结者C

<题目来源: 京东2017实习生招聘 原题链接-可在线提交(赛码网)>

### 问题描述

``````import sys

def calc(f, s, c, n):
destroy = [False for i in range(n)]
res = 0

for i, elem in enumerate(c):
if elem[0] <= f <= elem[1] or elem[0] <= s <= elem[1]:
if not destroy[i]:
res += 1
destroy[i] = True

return res

def main():
cars = []
segments = []

for i in range(0, n):
cars.append((line[0], line[0] + line[1]))
segments.append(line[0])

r = 0
for i in range(len(segments)):
for j in range(i):
r = max(r, calc(segments[i], segments[j], cars, n))

print r

if __name__ == '__main__':
main()
``````

# 幸运数

<题目来源: 京东2017秋招 原题链接-可在线提交(赛码网)>

### 问题描述

f(x)表示把x这个数用十进制写出后各个数位上的数字之和。如f(123)=1+2+3=6。
g(x)表示把x这个数用二进制写出后各个数位上的数字之和。如123的二进制表示为1111011，那么g(123)=1+1+1+1+0+1+1=6。

1.这类题目都要采用离线的计算方式，一次性先把数据规模内的数据全部计算到出来并保存，然后根据输出直接输出结果即可。
2.相对来说这个题目的数据规模较弱，注意到在当次计算时，如果个位没有发生进位的话，结果就是上次计算的结果+1，如果发生了进位再全部计算一次即可。这样可以节约非常大的一个计算量。

``````import sys

const_max_n = 100000 + 1

def _next(bits, last_sum, base):
bits[0] += 1
last_sum += 1

if bits[0] >= base:
last_sum = 0
for i in range(len(bits)):
if bits[i] >= base:
bits[i] = 0
else:
last_sum += bits[i]

bits.append(1)
last_sum += 1

return last_sum

def main():
r = [0 for i in range(0, const_max_n)]
_dec = [0]
_bin = [0]
last_bin_sum = last_dec_sum = 0

for i in range(1, const_max_n):
last_bin_sum = _next(_dec, last_bin_sum, 2)
last_dec_sum = _next(_bin, last_dec_sum, 10)

r[i] = r[i - 1]
if last_bin_sum == last_dec_sum:
r[i] += 1

for i in range(0, t_case):
print r[n]

if __name__ == '__main__':
main()``````

# 三子棋

<题目来源: 京东2016实习生招聘 原题链接-可在线提交(赛码网)>

### 问题描述

1：轮到先手下棋；
2：轮到后手下棋；

x：给定的棋局不是合法的棋局；
1 won：先手获胜；
2 won：后手获胜；
Draw：平局；

1.给定的棋局是否合法；
2.是否有获胜方；
3.平局
4.该谁下棋

1. = (0, 0)

sx = 0, sy = 0
for i <- 0 to 2:
sx += d[0]
sy += d[1]

import sys

start = [(2, 0), (1, 0), (0, 0), (0, 0), (0, 0), (0, 1), (0, 2), (2, 0)]
vector = [(0, 1), (0, 1), (0, 1), (1, 1), (1, 0), (1, 0), (1, 0), (-1, 1)]

def main():

``````while True:
x = o = 0
board = []
for i in range(3):
if len(line[0]) < 3:
return
for l in line[0]:
if l == 'X':
x += 1
elif l == '0':
o += 1
board.append(list(line[0]))

legal = True
w1 = w2 = False

if 0 <= x - o <= 1:
for i in range(8):
d = {'0': 0, 'X': 0, '.': 0}
dx, dy = start[i][0], start[i][1]
for j in range(3):
t = d.get(board[dx][dy])
d[board[dx][dy]] = t + 1
dx += vector[i][0]
dy += vector[i][1]

if d.get('X') == 3:
w1 = True
if d.get('0') == 3:
w2 = True

if w1 and w2 or x > o and w2 or x == o and w1:
legal = False

else:
legal = False

if legal:
if w1:
print '1 won'
elif w2:
print '2 won'
else:
if x + o == 9:
print 'draw'
elif x == o:
print '1'
else:
print '2'
else:
print 'x'

``````

if name == ‘__main__’:

``````main()

``````

*[1] 关于01背包问题及其扩展可以参考下列文章:
http://blog.csdn.net/mu399/ar…
http://blog.csdn.net/insistgo…

原文作者：lite
原文地址: https://segmentfault.com/a/1190000010633060
本文转自网络文章，转载此文章仅为分享知识，如有侵权，请联系博主进行删除。