2021美团校招(一)

小美的送花路线

在这里插入图片描述

输入描述

输出第一行包含一个正整数n,即花店和客户的总数。(1<=n<=30000)
接下来有n-1行,每行有三个整数u,v,w,表示在u和v之间存在一条距离为w的道路。(1<=w<=1000)

输出描述

输入
5
1 2 3
1 3 1
1 4 2
2 5 1

输出
10 10

思路

深度搜索就完事了

coding

#include <bits/stdc++.h>
using namespace std;
int main() {
    
    
    int n;
    scanf("%d", &n);
    unordered_map<int, vector<pair<int, int>>> mp;
    int total = 0;
    while (--n) {
    
    
        int sor, des, w;
        scanf("%d%d%d", &sor, &des, &w);
        mp[sor].push_back({
    
    des, w});
        total += w;
    }
    queue<pair<int, int>> q;
    q.push({
    
    1, 0});
    int maxLength = -1, sumLength = 0;
    while (!q.empty()) {
    
    
        pair<int, int> p = q.front();
        q.pop();
        int len = mp[p.first].size();
        if (!len) {
    
    
            maxLength = max(maxLength, p.second);
        } else {
    
    
            for (int i = 0; i < len; ++i) {
    
    
                pair<int, int> tmp = mp[p.first][i];
                q.push({
    
    tmp.first, p.second + tmp.second});
                sumLength += (p.second + tmp.second);
            }
        }      
    }
    total = total * 2 - maxLength;
    cout << sumLength << ' ' << total << endl;    
    return 0;
}

小美的评分计算器

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

输入描述

输入包含5个整数,依次分别表示商家获得1星到5星的评价数量,每一种评价的数量都不大于1000。

输出描述

输出仅包含一个保留一位的小数,表示商家在客户端上显示的评级。

实例

输入
2 2 1 1 2

输出
2.8

思路

先把数字扩大十倍然后再向下取整,再缩小十倍就行了

coding

#include<bits/stdc++.h>
using namespace std;
int ans[5];
double fun(double &num){
    
    
    double Num=num*10;
    double n;
    n=int(Num);
    return n/10;
}
int main(){
    
    
    int sum=0;
    float cos=0.0;
    double a;
    for(int i=1;i<=5;i++){
    
    
        scanf("%d",&ans[i]);
        cos+=ans[i];
        sum+=ans[i]*i;
    }
    a=sum/cos;
    //cout<<sum<<cos<<a;
    printf("%.1lf",fun(a));
    return 0;
}

小美的外卖节省钱计划

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

思路

结构体存数据,然后分情况讨论一下就行了

coding

#include<bits/stdc++.h>
using namespace std;
struct node{
    
    
    int x;   //满多少
    int y;   //优惠价格
    int z;   //付款钱
}money;
int ans[50005];
int main(){
    
    
    int n;
    int X=0,Y=0;
    cin>>n;
    while(n--){
    
    
        scanf("%d %d",&money.x,&money.y);
        if(money.x>money.y){
    
    
            X+=money.x;
            Y+=money.x-money.y;
        }
        else{
    
    
            X+=money.y;
            Y+=0;
        }
    }
    cout<<X<<' '<<Y;
    return 0;
}

小美的代金券要过期啦

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

输入描述

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

输出描述

输出仅包含一个整数,表示小美最多可以获得的奖励金数量。

实例

输入
5
1 1 1 1 1

输出
3

思路

就用两个栈来实现应该可以,但是自己没写出来,贴一个大佬写的

coding

n = int(input())
x = list(map(int, input().split()))
# 栈
stack = []
ans = 0
for i in range(n):
    while stack and x[i] == x[stack[-1]]:
        top = stack.pop()
        x[i] += 1
        ans += 1
    stack.append(i)
print(ans)
//感谢三百亿大佬

在这里插入图片描述

欢乐的时光总是短暂的,让我们下一次再见!!!

good good study,day day up! (study hard, improve every day)

预知后事,请听下回分解!!!!

猜你喜欢

转载自blog.csdn.net/qq_41606378/article/details/115274757