刷题记录(0528)

第一题 小苯的文章浏览

小苯是小红书的忠实用户之一。

这天,在“小红书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()

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值