peiwenjun's blog 没有知识的荒原

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;
}

posted on 2023-05-06 11:36  peiwenjun  阅读(11)  评论(0)    收藏  举报

导航