试题 算法训练 报数
问题描述
现有n个同学站成一圈,顺时针编号1至n。从1号同学开始顺时针1/2报数,报到1的同学留在原地,报到2的同学退出圆圈,直到只剩一名同学为止。问最后剩下的同学编号。
输入格式
仅一行,一个正整数n。
输出格式
仅一行,一个正整数。
样例输入
400
样例输出
289
数据规模和约定
n<=2000000
1,链表
import ipdb
class Dnode:
def __init__(self, value, prev=None, nxt=None):
self.val = value
self.prev = prev
self.next = nxt
def delete(one):
one.prev.next = one.next
one.next.prev = one.prev
if __name__ == '__main__':
#n = input()
n = 400
head = None
pre, nxt = None, None
for i in range(1, n+1):
if not pre:
pre = Dnode(i)
head = pre
else:
nxt = Dnode(i, prev=pre)
pre.next = nxt
pre = nxt
nxt = None
head.prev = pre
pre.next = head
tmp = head
flag = True
while tmp.next:
print(tmp.val)
flag = bool(1-flag)
if flag:
delete(tmp)
print('del:', tmp.val)
tmp = tmp.next
if tmp.next == tmp:
print(tmp.val)
break
2, 暴力法
import ipdb
if __name__ == '__main__':
#n = input()
n = 400
pp = [i for i in range(1, n+1)]
idx, cnt = 0, 0
flag = True
while True:
flag = bool(1-flag)
if flag:
pp[idx] = 0
cnt += 1
if cnt == n-1:
break
idx = (idx+1)%n
while not pp[idx]:
idx = (idx+1)%n