题目大意:
有一个 2 行 n 列的网格,所有格子初始为空。小小红初始在左上角 (1,1)。每次可以向上下左右相邻格子移动一步(不能走到障碍格,也不能走出网格)。 小小红需要到达第 n 列的任意一个空格子,并且总是选择最短步数的路径。
小红和小紫进行博弈(小红先手),轮流执行操作:
1.选择一个当前为空且不为起点的格子放置障碍,使小小红无法进入该格子;
2.要求放置后,从起点 (1,1) 仍然存在一条路径能够到达第 n 列的某个空格子。 若当前不存在满足要求的格子可放置障碍,则博弈结束。
两人都按最优策略行动:小红希望最终最短步数尽量小,小紫希望最终最短步数尽量大。博弈结束后,小小红从起点出发。请输出她到达第 n 列所需的最少步数。
解题思路:
小红要使路径尽可能短,就需要堵住小小红向上或向下的路;小紫要使路径尽可能大,就需要堵住小小红直接向右走的路。
从(1,1)出发,手动模拟前几次放置障碍的最优情况,红1(2,3),紫1(1,5),红2(1,8),紫2(2,10),红3(2,13),紫3(1,15).
从中可以找出规律,从1到n向右共走了n-1步,而每向右走五步必定被逼出一次换行,所以最终步数=n-1+n/5.
参考代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll t;
cin>>t;
for(int i=0;i<t;i++){
ll n;
cin>>n;
cout<<(n-1)+n/5<<'\n';
}
return 0;
}



京公网安备 11010502036488号