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没时间了













种一棵树最好的时间是十年前,其次是现在。
原文地址:https://www.cnblogs.com/islch/p/13424112.html