第一题 小苯的文章浏览
小苯是小红书的忠实用户之一。
这天,在“小红书app”发了一篇文章后,收获了若干浏览量。但其中有人浏览了多次,小苯现在想知道所有人第一次浏览的先后顺序,请你帮帮他吧。
输入描述:
输入包含n+1行。
第一行一个正整数n,表示小苯拿到的浏览记录的记录条数。
接下来每行一个字符串s (长度在20)以内,表示id为s的用户此时浏览了一次小苯的文章。
输出描述:
输出包含若干行,每行一个字符串s,表示用户的id。按照每个浏览的用户第一次浏览的顺序输出。
输入:
8
qcjj
benh
qsmcgogo
qcjj
ducksajin
benh
ducksajin
acidlemon
输出:
qcjj
benh
qsmcgogo
ducksajin
acidlemon
提示:
共有以上5人点赞,按照第—次点的顺序输出即可。
代码:
利用集合的性质即可
def main():
n = int(input())
seen = set()
ans = []
for _ in range(n):
s = input()
if s in seen:
continue
seen.add(s)
ans.append(s)
for e in ans:
print(e)
if __name__ == "__main__":
main()
第二题 小苯的粉丝关注
小苯是“小红书app”的忠实用户,他有n个账号,每个账号粉丝数为。
这天他又创建了一个新账号,他希望新账号的粉丝数恰好等于x。为此他可以向自己已有账号的粉丝们推荐自己的新账号,这样以来新账号就得到了之前粉丝的关注。
他想知道,他最少需要在几个旧账号发“推荐新账号”的文章,可以使得他的新账号粉丝数恰好为x,除此以外,他可以最多从中选择一个账号多次发“推荐新账号”的文章。
(我们假设所有旧账号的粉丝们没有重叠,并且如果在第i个旧账号的粉丝们推荐了新账号,则新账号会直接涨粉 ai/2下取整个,而如果小苯选择在第 i个旧账号中多次推荐新账号,那么新账号就可以直接涨粉。)
输入描述:
输入包含2行。 第一行两个正整数 n, x(1 ≤ n, k ≤ 100),分别表示小苯的旧账号个数,和新账号想要的粉丝数。 第二行n个正整数 (1 ≤ ≤ 100),表示小苯每个旧账号的粉丝数。
输出描述:
输出包含一行一个整数,表示小苯最少需要向多少个旧帐号推荐新账号,如果无法做到,输出-1。
输入:
5 8
1 2 3 4 10
输出:
2
提示:选择第3个和第5个旧账号,并在第3个账号多次发文。
思路:
动态规划
每个账号有三种状态:不发,发一次或者多发
import sys
def dfs(i, x, extra, n, a, memo):
if x == 0:
return 0
if i >= n:
return n + 1
if memo[i][x][extra] != -1:
return memo[i][x][extra]
no = dfs(i + 1, x, extra, n, a, memo)
one = n + 1
if x >= a[i] // 2:
one = dfs(i + 1, x - a[i] // 2, extra, n, a, memo) + 1
multi = n + 1
if x >= a[i] and not extra:
multi = dfs(i + 1, x - a[i], True, n, a, memo) + 1
memo[i][x][extra] = min(no, one, multi)
return memo[i][x][extra]
def main():
input = sys.stdin.read
data = input().split()
n = int(data[0])
x = int(data[1])
a = list(map(int, data[2:2+n]))
memo = [[[-1 for _ in range(2)] for _ in range(x + 1)] for _ in range(n + 1)]
ans = dfs(0, x, False, n, a, memo)
if ans == n + 1:
print(-1)
else:
print(ans)
if __name__ == "__main__":
main()