【Codeforces1327C】Game with Chips(构造)

题目大意:

给出一个\(n\)\(m\)列的地图,地图上存在\(k\)个点需要分别经过其各自的目标位置,你能执行\(2nm\)次以内的操作,每次操作将地图中所有不会出界的点移动一格(上、下、左、右)。求出需要操作的步骤。\((1\le n,m,k\le 200)\)


无论这\(k\)个点在什么位置,都可以通过以下步骤达到目标:

  1. 将所有点移动到其所在列的最上边,这最多需要向上移动\(n-1\)次。

  2. 将所有点移动到位置\((1,1)\),这最多需要向左移动\(m-1\)次。

  3. 将所有点从\((1,1)\)开始遍历整个地图,这需要\(nm-1\)次操作

所以操作次数为\(nm+n+m-3\)次。

因为\(2nm-(nm+n+m-3)\)

\(=nm-n-m+3\)

\(=(n-1)(m-1)+2\ge 2\ge 0\)

所以\(2nm\ge nm+n+m-3\),以上方案符合题意。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,k;
ll sx[200+10],sy[200+10],fx[200+10],fy[200+10];
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m >> k;
	for(ll i=1;i<=k;i++)cin >> sx[i] >> sy[i];
	for(ll i=1;i<=k;i++)cin >> fx[i] >> fy[i];
	cout << m*n+n+m-2 << endl;
	for(ll i=1;i<n;i++)cout << 'U' ;
	for(ll i=1;i<m;i++)cout << 'L' ;
	for(ll i=1;i<=n;i++){
		for(ll j=1;j<=m;j++){
			if(j==m)cout << 'D' ;
			else if(i%2==1)cout << 'R' ;
			else cout << 'L' ;
		}
	}
	return 0;
}
posted @ 2023-08-31 20:03  Alric  阅读(4)  评论(0编辑  收藏  举报