codeforces 1327C Game with Chips 构造

本文探讨了一种在限定步数内使多个机器人至少一次到达指定位置的算法。通过构造策略,利用暴力遍历方法,确保在2*n*m步内完成任务。特别讨论了n=1的特殊情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://vjudge.net/problem/CodeForces-1327C
在这里插入图片描述在这里插入图片描述
题目大意:给一个 n ∗ m n*m nm的矩形,其中有 k k k个位置有机器人,给出它们的初始位置和要经过的位置,每次操作可以选取上下左右四个方向之一,使得所有的机器人向同一方向移动一步,如果已经在边界了则不做改变。问能否在 2 ∗ n ∗ m 2*n*m 2nm步操作之内使得所有的机器人都至少经过了 1 1 1次其要经过的位置。

思路:构造题,就这我还能想到假的贪心,菜哭 . j p g .jpg .jpg。其实看到这个 2 ∗ n ∗ m 2*n*m 2nm这么大的数字就感觉不太对劲了,考虑采用最暴力的方法,首先通过 m − 1 m-1 m1次操作把所有机器人都移动到最右侧,再通过 n − 1 n-1 n1次操作把所有机器人移动到最上侧,然后开始暴力遍历整个矩形。那么总操作次数就等于 m − 1 + n − 1 + m ∗ ( n − 1 ) + m − 1 m-1+n-1+m*(n-1)+m-1 m1+n1+m(n1)+m1,我们假设它小于等于 2 ∗ n ∗ m 2*n*m 2nm,易得 2 ∗ ( m − 1 ) − m < = n ∗ ( m − 1 ) 2*(m-1)-m<=n*(m-1) 2(m1)m<=n(m1),那么只需要证明 2 ∗ ( m − 1 ) < = n ∗ ( m − 1 ) 2*(m-1)<=n*(m-1) 2(m1)<=n(m1)即可,显然在 n > = 2 n>=2 n>=2时均成立,那么特判 n = 1 n=1 n=1的情况就行了。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

int n,m,k,v,len=0;
char ans[400*200+5];

int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=k;i++)
        scanf("%d%d",&v,&v);
    for(int i=1;i<=k;i++)
        scanf("%d%d",&v,&v);
    if(n==1)
    {
        for(int i=1;i<m;i++)
            ans[len++]='R';
        for(int i=1;i<m;i++)
            ans[len++]='L';
    }
    else
    {
        for(int i=1;i<m;i++)
            ans[len++]='R';
        for(int i=1;i<n;i++)
            ans[len++]='U';
        int cur=m,times=0;
        char ch;
        while(1)
        {
            ch='U';
            if(++times&1)
                ch='D';
            for(int i=1;i<n;i++)
                ans[len++]=ch;
            if(--cur<=0)
                break;
            ans[len++]='L';
        }
    }
    ans[len++]='\0';
    printf("%d\n%s\n",len-1,ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值