今日头条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了。。。