• 2020.8.2 19:00-21:00 拼多多算法岗笔试


    题目1:飞行棋,输入K(距离),N(掷骰子的次数),问最后飞行棋到终点的距离是多少?,需要返回多少次?(因为飞行棋如果超出终点的话会返回的)如果为0的话输出“paradox”。

    坑是最后一步到达终点,不能算输出paradox,96%ac。
    以及k可以是0,这时直接输出

    # k, n = list(map(int, input().split()))
    # x = list(map(int, input().split()))
    k, n = 10,3
    x=[4,1,5]
    count = 0
    temp = k
    if temp == 0:
        print("paradox")
    else:
        for i in x:
            temp -= i
            if temp == 0:
                break
            elif temp > 0:
                continue
            else:
                temp = -temp
                count += 1
        if temp:
            print(abs(temp), count)
        # 下面这一步就是那个坑
        elif i==x[-1]:
            print(i, count)
        else:
            print("paradox")
    

    题目2:骰子的六个面是1到6组成,12、34、56相对(好像有这个条件)。输入是N和N个观察序列(序列是骰子的上下左右前后面的数字),问有几种不同的骰子,并降序输出不同骰子的个数。

    没有别的方法,数学题,当时浪费很多时间
    重点在于如何给这个骰子定义个标准化的方法,下面是把1移到最上面(不同面的变换画画图),然后把此外最小的3移到最左边。那么就能够定义全部结果。

    作者:Brown-2
    链接:https://www.nowcoder.com/discuss/465035?type=post&order=time&pos=&page=1&channel=666&source_id=search_post
    来源:牛客网
    
    N = int(input())
    nums = []
    for i in range(N):
        nums.append(list(int(x) for x in input().split()))
     
    def trans(num):
        i = num.index(1)
        if i == 0:
            pass
        elif i == 1:
            num[0], num[1], num[2], num[3] = num[1], num[0], num[3], num[2]
        elif i % 2 == 0:
            num[0], num[1], num[i], num[i + 1] = 
                num[i], num[i + 1], num[1], num[0]
        else:
            num[0], num[1], num[i - 1], num[i] = 
                num[i], num[i-1], num[0], num[1]
    
        l2 = min(num[2:])
        i = num.index(l2)
        if i == 2:
            pass
        elif i == 3:
            num[2], num[3], num[4], num[5] = num[3], num[2], num[5], num[4]
        elif i == 4:
            num[2], num[3], num[4], num[5] = num[4], num[5], num[3], num[2]
        else:
            num[2], num[3], num[4], num[5] = num[5], num[4], num[2], num[3]
        return num
    
    d = {}
    for i in nums:
        i = tuple(trans(i))
        d[i] = d.get(i, 0) + 1 # 字典get默认为0,因为没出现过的排列都是0
    M = len(d)
    res = list(d.values())
    res.sort(reverse = True)
    print(M)
    print(*res)
    

    题目3:吃东西,N,M是中餐和晚餐的套餐个数,T是需要满足的最少的美味值

    输入:N行,每行两个数,xi和yi分别表示热量和美味值,再输入M行,每行两个数,xi和yi分别表示热量和美味值。
    输出:中餐和晚餐的美味值>=T的情况下,热量值是多少?
    注意中、晚餐各自都只能吃一顿,满足不了>=T输出-1,T=0时输出0

    开始想成了背包问题,但是要知道每一顿只能吃一个套餐啊,注意空间优化的遍历就完事了

    作者:小健0601
    链接:https://www.nowcoder.com/discuss/465041?type=post&order=time&pos=&page=1&channel=666&source_id=search_post
    来源:牛客网
    
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<iostream>
    #include<algorithm>
    #include<map>
    #include<vector>
    #include<string>
    #include<stack>
    #include<queue>
    using namespace std;
    int M,N,T;
    struct item{
        int X,Y;
    };
    item m[100100],n[100100];
    int minX[100100];
    bool cmp(const item &a,const item &b){
        return a.Y < b.Y;
    }
    int ans = 0x7f7f7f7f;
    int main(){
        scanf("%d%d%d",&M,&N,&T);
        if(T==0){
            cout<<"0";
            return 0;
        }
        for(int i = 0;i < M;i++){
            scanf("%d%d",&m[i].X,&m[i].Y);
        }
        for(int i = 0;i < N;i++){
            scanf("%d%d",&n[i].X,&n[i].Y);
        }
        sort(m,m+M,cmp);
        sort(n,n+N,cmp);
        for(int i = 0;i < M;i++){
            if(m[i].Y >= T && m[i].X < ans){
                ans = m[i].X;
            }
        }
        for(int i = 0;i < N;i++){
            if(n[i].Y >= T && n[i].X < ans){
                ans = n[i].X;
            }
        }
        minX[N] = 0x7f7f7f7f;
    
        // 下面这个for什么意思呢,因为是按美味值升序排列了,这个minX[i]就是保存了i这个下标之后最小的能量值,后面会用到。
        // 因为这个下标之后的美味值都符合要求了(当下标i的美味值符合要求,后面的都比他美味值大)
        for(int i = N - 1;i >= 0;i--){
            minX[i] = min(n[i].X,minX[i + 1]);
        }
        // 第二个数组从后面开始遍历
        int j = N - 1;
        for(int i = 0;i < M;i++){
            //先定位到最左边的符合美味值要求的下标之前一个,注意这里定位到了之前一个
            while(j >= 0 && n[j].Y + m[i].Y >= T)--j;
            // 所以第一个符合要求的下标就是j+1,然后用这个下标去取minX,就是这个下标之后的所有套餐(美味值递增)中的最小能量
            // 然后小于ans的话就替换
            if(n[j + 1].Y + m[i].Y >= T && minX[j + 1] + m[i].X < ans){
                ans = minX[j + 1] + m[i].X;
            }
        }
        // ans还是原始值的话说明T太大了,没有满足>=T要求的组合
        if(ans >= 0x7f7f7f7f) cout<<"-1";
        else cout<<ans;
    
        return 0;
    }
    

    题目4:6*6的地图种6种蔬菜,地图中‘“#”的地方是障碍物,要求上下左右不同种类,问方法数。

    dp没时间了













    种一棵树最好的时间是十年前,其次是现在。
  • 相关阅读:
    CDH5.13 集成Kerberos配置
    使用bash脚本删除文件最后几行
    yolov3模型微调(fine-tune)备忘
    ubuntu 18.04 rsync 命令使用 服务端配置
    python 子包调用 跨目录调用
    [转]命令行界面 (CLI)、终端 (Terminal)、Shell、TTY的联系与区别
    bash shell 判断变量是否在列表中
    TensorFlow 图像分类模型 inception_resnet_v2 模型导出、冻结与使用
    numpy 数组集合运算及下标操作
    Win10 Service'MongoDB Server' failed to start. Verify that you have sufficient privileges to start system services【简记】
  • 原文地址:https://www.cnblogs.com/islch/p/13424112.html
Copyright © 2020-2023  润新知