CF1817D Toy Machine 题解
题目描述
给定 \(2\times n\) 的网格,保证 \(n\) 是奇数,其中 \((2,1),(2,\frac{n+1}2),(2,n)\) 是障碍物。
初始有 \(n-2\) 个玩具,分别在 \((1,2),\cdots,(1,n-1)\) 的位置。
每一步操作你可以选择一个方向,将所有玩具朝这个方向移动到底,但不能超出网格或进入障碍物。
给定 \(k\) ,构造一个长度 \(\le 10^6\) 的操作序列,使得第 \(k\) 个玩具被移动到 \((1,1)\) 的位置。
数据范围
- \(5\le n\le 10^5,1\le k\le n-2\) 。
时间限制 \(\texttt{1s}\) ,空间限制 \(\texttt{256MB}\) 。
分析
这个软件可以将每一步操作直观地展现出来。
\(k\le\frac{n+1}2\) 的情况是容易的,注意到 \(\texttt{RDRU}\) 干的事情是往右下角填一个数,因此先执行 \(\frac{n-1}2-k\) 轮 \(\texttt{RDRU}\) ,再执行 \(\texttt{DL}\) 即可达成目标。
对于 \(k\gt\frac{n+1}2\) 的情况,通过镜像我们可以让第 \(k\) 个玩具到达 \((1,n)\) 。
我们希望将所有玩具堆积到网格右侧,注意此时左侧恰有 \(\frac{n-3}2\) 个格子,而每个 \(\texttt{URDR}\) 操作会让左侧减少一个格子。
因此再执行 \(\frac{n-3}2\) 轮 \(\texttt{URDR}\) 操作,我们可以填满所有纵坐标 \(\gt\frac{n+1}2\) 的格子。
再执行 \(\texttt{LDRU}\) ,那么所有玩具都在第一行,并且第 \(k\) 个玩具刚好为第 \(\frac{n-1}2\) 个。
再执行 \(\texttt{RDL}\) 即可通关。
操作次数 \(\le 4n-3\) ,符合要求。
#include<bits/stdc++.h>
using namespace std;
int k,m,n;
int main()
{
scanf("%d%d",&n,&k),m=(n-1)/2;
if(k<=m)
{
for(int i=1;i<=m-k;i++) printf("RDRU");
printf("DL\n");
}
else
{
for(int i=1;i<=k-m;i++) printf("LDLU");
printf("DR");
for(int i=1;i<=m-1;i++) printf("URDR");
printf("LDRURDL\n");
}
return 0;
}
本文来自博客园,作者:peiwenjun,转载请注明原文链接:https://www.cnblogs.com/peiwenjun/p/17376779.html
浙公网安备 33010602011771号