https://vjudge.net/problem/CodeForces-1327C
题目大意:给一个
n
∗
m
n*m
n∗m的矩形,其中有
k
k
k个位置有机器人,给出它们的初始位置和要经过的位置,每次操作可以选取上下左右四个方向之一,使得所有的机器人向同一方向移动一步,如果已经在边界了则不做改变。问能否在
2
∗
n
∗
m
2*n*m
2∗n∗m步操作之内使得所有的机器人都至少经过了
1
1
1次其要经过的位置。
思路:构造题,就这我还能想到假的贪心,菜哭 . j p g .jpg .jpg。其实看到这个 2 ∗ n ∗ m 2*n*m 2∗n∗m这么大的数字就感觉不太对劲了,考虑采用最暴力的方法,首先通过 m − 1 m-1 m−1次操作把所有机器人都移动到最右侧,再通过 n − 1 n-1 n−1次操作把所有机器人移动到最上侧,然后开始暴力遍历整个矩形。那么总操作次数就等于 m − 1 + n − 1 + m ∗ ( n − 1 ) + m − 1 m-1+n-1+m*(n-1)+m-1 m−1+n−1+m∗(n−1)+m−1,我们假设它小于等于 2 ∗ n ∗ m 2*n*m 2∗n∗m,易得 2 ∗ ( m − 1 ) − m < = n ∗ ( m − 1 ) 2*(m-1)-m<=n*(m-1) 2∗(m−1)−m<=n∗(m−1),那么只需要证明 2 ∗ ( m − 1 ) < = n ∗ ( m − 1 ) 2*(m-1)<=n*(m-1) 2∗(m−1)<=n∗(m−1)即可,显然在 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;
}