美团笔试

热搜

小美被上司委派开发一个实时热搜的榜单。该榜单需要支持以下几种操作:

操作1:接收到某条新闻的热度提升了多少,更新数据库,并调整榜单排行。初始时,数据库中不存在任何新闻。

操作2:接收到用户的查询操作,返回热度最高的十条新闻。若此时数据库中新闻不足十条,那么有几条输出几条即可。例如数据库中新闻不足十条,那么只需要返回热度最高的三条新闻。当两条新闻热度相同时,新闻编号小的在前。特别地,当数据库中没有任何新闻时,需要给出null。

现在你需要协助小美完成开发工作

输入描述:
第一行一个正整数n,表示接下来有n条操作(1<=n<=100000)

接下来n行,每行是两种操作中的一种:

append x y:其中x和y是两个正整数,表示接收到新闻x的热度提升了y。(新闻编号范围为[1,1000],单次热度提升y的范围是[1,1000])

query:用户向你发来查询。

输出描述:
对于每条用户查询,输出最高的十条新闻,以空格分隔。不足十条时,有几条输出几条。没有新闻时,输出null。每条查询的输出占一行。

样例输入:

9
query
append 1 10
query
append 2 20
query
append 3 15
query
append 1 10
query

样例输出:

null
1
2 1
2 3 1
1 2 3

code–python

def HotNew(oper,n):
    hot_new = dict()
    for i in range(0,n):
        if oper[i][0] == "append":
            key = oper[i][1]
            if key in hot_new:
                hot_new[key] += oper[i][2]#已有,则升值
            else:
                hot_new[key] = oper[i][2]#没有则添加
            res = sorted(hot_new.items(), key=lambda x: x[1],reverse= True)#以value排序成列表,列表元素为元组
        else:
            sz = len(hot_new)
            cnt = 10 if sz>=10 else sz
            if cnt == 0:
                print("null")
            else:
                for i in range(0,cnt):
                    print(res[i][0],end = " ")
                print(" ")
    return

#获取输入
n = int(input())
oper = []
for i in range(0,n):
    l = []
    l = input().split()
    oper.append(l)
for i in range(0,n):
    if oper[i][0] != "query":
        for j in range(1,3):
            oper[i][j] = int(oper[i][j])
HotNew(oper,n)

玩具对抗

小美有一些玩具士兵,这天小团来到小美家一起玩耍,小美决定将玩具士兵分为两拨,一拨自己留着,一拨给小团。不妨标记小美拿到的是玩具兵团A,小团拿到的是玩具兵团B。每支兵团下面会率领许多小队。每支小队有队伍中的玩具兵人数和每个兵的战斗力。就样例而言,小美的兵团A有3支小队,第一支小队是战斗力为1的兵3个,第二支小队是战斗力为4的兵3个,第三支小队是战斗力为2的兵6个。

由于小美和小团使用的玩具战场条件较为恶劣,这场地图约定战斗力必须大于等于k的玩具兵才能上场。因此,小美和小团只会派战斗力大于等于k的玩具兵参加战斗。

通常情况下,我们或预测战斗力之和高的队伍获胜,现在给你两只玩具兵团所率领的小队的人数和战斗力。要求你输出两只玩具兵团能够排派出的玩具兵的战斗力之和,并请你预测获胜方是谁。数据保证两只玩具兵团战斗力之和不相等。换句话说,一定能分出胜负。

输入描述:
第一行三个正整数n,m,k。其中n代表玩具兵团A的小队数量,m代表玩具兵团B的小队数量,k代表战场要求的战斗力最低值

接下来n行,每行两个正整数x,y,表示玩具兵团A的其中一支小队有x个战斗力为y的玩具兵。

接下来m行,每行两个正整数x,y,表示玩具兵团B的其中一支小队有x个战斗力为y的玩具兵。

1<=n,m<=1000,1<=k<=1000,1<=x,y<=1e9

输出描述:
两行。

第一行两个正整数,以空格分隔,分别表示小美能派出的战斗力总和,小团能派出的战斗力总和。

第二行一个字符A或者B表示获胜方是小美还是小团。若小美获胜则输出A,反之则B。

样例输入:

3 4 3
3 1
3 4
6 2
2 4
3 1
1 5
4 2

样例输出:

12 13
B

code–python

def Game(L1,n,L2,m,k):
    sum_L1,sum_L2 = 0,0
    #统计兵力总和
    for i in range(0,n):
        sum_L1 += L1[i][1]*L1[i][0] if L1[i][1]>=k else 0
    for i in range(0,m):
        sum_L2 += L2[i][1]*L2[i][0] if L2[i][1]>=k else 0
    print(str(sum_L1)+" "+str(sum_L2))
    print("A") if sum_L1>sum_L2 else print("B")

#输入获取
n,m,k = map(int,input().split())
L1 = []
for i in range(0,n):
    l=[]
    l = list(input().split())
    L1.append(l)
L2 = []
for i in range(0,m):
    l = []
    l = list(input().split())
    L2.append(l)
for i in range(0,n):
    L1[i] = [int(x) for x in L1[i]]
for i in range(0,m):
    L2[i] = [int(x) for x in L2[i]]
Game(L1,n,L2,m,k)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值