美团-算法-笔经

一.小美的评分计算器
美团对于商家的评价体系是1-5星评价体系,用户在完成订单之后可以对商家打1/2/3/4/5星,而在客户端上,商家的评级却不一定是整数,而是会显示小数点后的一位。很显然这就需要一个计算器了,小美拥有了一些商户的评价数据,希望可以计算出商家在客户端上显示出的评分。
这个评分的计算非常简单,就是对该商家的所有客户的星级评价做求一个平均,然后去尾法显示小数点后的一位即可,例如平均得分是3.55,则显示的是3.5。例如某商家获得了1-5星评价各一个,则显示的评分是(1+2+3+4+5)/5=3.0。
如果商家没有获得评价,则显示0.0。

输入描述
输入包含5个整数,依次分别表示商家获得1星到5星的评价数量,每一种评价的数量都不大于1000。
输出描述
输出仅包含一个保留一位的小数,表示商家在客户端上显示的评级。

样例输入
2 2 1 1 2
样例输出
2.8

AC

ls = list(map(int,input().split()))
res=0
num=0
for i in range(1,6):
    res+=i*ls[i-1]
    num+=ls[i-1]
res/=num
if res==0:
    print(0.0)
else:
    print (str(res).split('.')[0] + '.' + str(res).split('.')[1][:1])

二.小美的代金券要过期啦
外卖节即将过去了,小美还有很代金券没有消费掉,美团面向小美这样的用户推出了一个新的活动,即代金券消消乐活动。系统会把小美的代金券打乱顺序排成一排,小美可以进行任意多次如下操作:
如果存在相邻的两个代金券金额相等,设其面额为x,小美可以使用这两张代金券换一张面额为x+1的代金券,并将其仍放在原来两张券的位置上,每进行一次这样的操作,小美就可以获得1元可以无限期使用的奖励金。
小美觉得奖励金可太香了,因此她想获得尽可能多的奖励金,请问她最多可以获得多少奖励金。

输入描述
输入第一行仅包含一个正整数n,表示小美拥有的代金券数量。(1<=n<=500)
输入第二行包含n个正整数,每个整数x表示一张代金券的面额,同时这也是系统排出的代金券顺序。(1<=x<=100)
输出描述
输出仅包含一个整数,表示小美最多可以获得的奖励金数量。

样例输入
5
1 1 1 1 1
样例输出
3

提示
样例解释:
{1,1,1,1,1}->{1,1,1,2}->{1,2,2}->{1,3}

AC

n = int(input())
ls = list(map(int,input().split()))

def xxl(nums):
    A=0
    N=len(nums)
    i=N-1
    while i>0:
        if nums[i]==nums[i-1]:
            nums.pop(i)
            nums[i-1]+=1
            A+=1
            N-=1
            i=N-1
        else:
            i-=1
    return A


if n==1:
    print(0)
else:
    print(xxl(ls))

三.小美的外卖节省钱计划
2020年的618不再仅仅是购物节啦,同时也是美团外卖节,小美早早就准备好了各种满减代金券,为了最大程度的“省钱”,当然是选择把这些代金券都用光啦!
这些代金券都有一个使用门槛,即满多少元的订单才可以使用。如果使用一个二元组<x,y>表示一张代金券,即需要满x元才能优惠y元,那么需要注意的是,并不是所有代金券的x都是大于等于y的,良心美团也会推出一些x<y的代金券。如果x<y,例如x=1,y=2,则购买1元商品的情况下无需付款,不会退款给用户。
请问小美如果想用完这些代金券,在保证总付款金额最小的情况下,她最多购买多少钱的外卖呢?
说明:
1.一个订单只能用一张代金券。
2.同时满足总付款金额最少,且购买的外卖价值最高,例如两个优惠完都是1元的外卖,一个原价3元另一个原价4元,则选四元的。
3.由于美团商户很多,所以对于任何一个价格我们都可以找到至少一种商品购买。

输入描述
输入第一行仅包含一个正整数n,表示小美拥有的代金券数量。(1<=n<=50000)
接下来有n行,每行有两个整数x和y,表示一张代金券需要订单金额满x元可以使用,能够优惠y元。(1<=x<=10000,1<=y<=10000)
输出描述
输出仅包含两个正整数,中间用空格隔开,分别表示小美购买的外卖价值和她的实际付款金额。

样例输入
3
5 3
10 5
1 2
样例输出
17 7

AC

n = int(input())
ls=[]
for _ in range(n):
    ii = list(map(int,input().split()))
    ls.append(ii)

def dj(nums):
    values=0
    actualyouhui=0
    for i in range(len(nums)):
        if nums[i][0]>=nums[i][1]:
            values+=nums[i][0]
            actualyouhui+=nums[i][1]

        else:
            values+=nums[i][1]
            actualyouhui+=nums[i][1]

    return [values,values-actualyouhui]
res=dj(ls)
print(res[0],end=" ")
print(res[1])
2021届秋招算法岗笔经面经 文章被收录于专栏

小白一枚,有误的地方还请大佬们指正

全部评论
黄黑树的呢 题目忘记了
点赞 回复 分享
发布于 2020-08-08 21:17
黄黑树难得做了 大佬AC了吗
点赞 回复 分享
发布于 2020-08-09 10:38
大佬,最小送花距离的那一题题解有嘛
点赞 回复 分享
发布于 2020-08-09 21:43
小姐姐 我没AC那题 0.0
点赞 回复 分享
发布于 2020-08-09 23:29

相关推荐

10-05 23:02
东北大学 Java
我说句实话啊:那时候看三个月培训班视频,随便做个项目背点八股,都能说3 40w是侮辱价
点赞 评论 收藏
分享
10-17 10:05
已编辑
北华大学 全栈开发
牛客872465272号:掉头发了哥
点赞 评论 收藏
分享
评论
1
1
分享
牛客网
牛客企业服务