今日头条2019届实习笔试题(第五题,跳板)

今日头条2019届实习笔试题(第五题,跳板)

前两天做的题目,笔试的时候因为自己犯蠢只ac了40%。

题目表述:

这里写图片描述
这里写图片描述

如果看不清图片,文字描述如下:

小T最近迷上一款跳板小游戏
已知空中有N个高度互不相同的跳板,小T刚开始在高度为0的地方,每次跳跃可以选择与自己高度绝对值小于等于H的跳板,跳跃过后到达以跳板为轴的镜像位置,问小T在最多跳K次的情况下最高能跳多高?(任意时刻,高度不能为负)

输入:

第一行三个整数N,K,H
以下N行,每行一个整数Ti,表示第i个跳板的离地高度

输出:

样例:

in:
3 3 2
1
3
6
out:
8

思路:

看到题目第一反应是状态模拟,考虑贪心。但是马上可以举出反例(输入样例改成每次可以跳3m)。然后去列出状态转移方程:
H(i+1) = H(i) +(X - H(i))*2
其中X是不确定的,是在当前位置能跳到的跳板高度。

因为X是不确定并且可能是一个集合,所以:每个阶段的最优状态是由之前所有阶段的状态的组合得到的->搜索;这里的话用BFS。

代码如下:

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Node 
{
    int val;//current height
    int hight;//next jump pad height
    int deadline;//remain jump times+1;
};
int main(){
    int N,K,H;
    cin >>N;
    cin >> K;
    cin >> H;
    vector<int>Ti(N);
    int temp_max = 0;
    for (int i=0;i<N;i++)
    {
        cin >> Ti[i];
    }
    queue<Node>my_que;
    Node init;
    init.hight = 0;
    init.val = 0;
    init.deadline = K;
    my_que.push(init);
    Node temp;
    while(!my_que.empty()){
        temp = my_que.front();
        my_que.pop();
        int temp_val;
        temp_val = temp.val +(temp.hight - temp.val)*2;
        if(temp_val>temp_max)
            temp_max = temp_val;
        for(int i=0; i< N;i++){
            if(Ti[i] > temp_val && Ti[i] <= temp_val +H){
                Node temp_node;
                temp_node.val = temp_val;
                temp_node.hight = Ti[i];
                temp_node.deadline = temp.deadline-1;
                if (temp_node.deadline >=0)
                {
                    my_que.push(temp_node);
                }
            }

        }
    }
    printf("%d\n", temp_max);
    return 0;
}

不保证能100%AC,因为笔试的时候没有试。笔试40%AC是因为我忘记限定跳跃次数K了。。。

猜你喜欢

转载自blog.csdn.net/u014744127/article/details/79695547