AtCoder Regular Contest 103 Problem D Robot Arms (构造)

题目链接  Problem D

给定$n$个坐标,然后让你构造一个长度为$m$的序列,

然后给每个坐标规定一个长度为$m$的序列,ULRD中的一个,意思是走的方向,

每次从原点出发按照这个序列方向,每次走的距离是对应位置的那个值,

最后要走到那个坐标。

直接构造,无解的条件是$x$和$y$的和奇偶性不全相等。

我当时想不出来是因为感觉两个方向不好控制,结果其实可以用二进制统一操作。

如果和是偶数那么加一个往右走一个的单位的操作转化为奇数就行。

然后按照二进制的方法从小到大一个个转换,就像转二进制那样。

接下来输出就好了。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)
#define MP		make_pair
#define fi		first
#define se		second

typedef long long LL;

const int N = 1e3 + 5;

int a[N], b[N];
int n, m, c, fg;
char s[45];

int main(){

	scanf("%d", &n);
	c = 0;

	rep(i, 1, n){
		scanf("%d%d", a + i, b + i);
		if ((a[i] + b[i]) & 1) ++c;
		else --c;
	}

	if (abs(c) != n) return 0 * puts("-1");

	m = 31 + (c < 0);

	printf("%d\n", m);
	rep(i, 0, 30) printf("%d ", 1 << i);
	if (c < 0) putchar(49);
	putchar(10);

	rep(i, 1, n){
		int x = a[i], y = b[i];
		if (c < 0) s[31] = ‘R‘, --x;
		fg = 0;
		dec(j, 30, 0){
			if (abs(x) < abs(y)) swap(x, y), fg ^= 1;
			if (x > 0) x -= 1 << j, s[j] = fg ? ‘U‘ : ‘R‘;
			else x += 1 << j, s[j] = fg ? ‘D‘ : ‘L‘;
		}

		puts(s);
	}

	return 0;
}

原文地址:https://www.cnblogs.com/cxhscst2/p/9733356.html

时间: 2024-11-05 18:31:50

AtCoder Regular Contest 103 Problem D Robot Arms (构造)的相关文章

AtCoder Regular Contest 103

AtCoder Regular Contest 103 一些吐槽 参加的第一场\(ARC\):一个模拟 + 三个构造 没见过比这更令人感动的题型设置了(简直就是针对我(TAT)) . 感觉全场就我一个人\(E\)题WA了四遍才过....... C-//// 题目大意: 网址 给定一个串\(S\),要求修改一些字符,使得串满足以下条件: \(S_i = S_{i+2}\) \(S_1 \neq S_2\) . 问最少需要修改多少个字符. 题解: 无脑统计一下奇数和偶数格的每种种类. 然后在最大值和

AtCoder Regular Contest 103 题解

C-/\/\/\ #include<algorithm> #include<iostream> #include<cstdlib> #include<iomanip> #include<cstring> #include<complex> #include<vector> #include<cstdio> #include<string> #include<bitset> #includ

AtCoder Grand Contest 025 Problem D

www.cnblogs.com/shaokele/ AtCoder Grand Contest 025 Problem D Time Limit: 2 Sec Memory Limit: 1024 MB Description Takahashi is doing a research on sets of points in a plane. Takahashi thinks a set \(S\) of points in a coordinate plane is a good set w

AtCoder Grand Contest 024 Problem E(动态规划)

www.cnblogs.com/shaokele/ AtCoder Grand Contest 024 Problem E Time Limit: 2 Sec Memory Limit: 1024 MB Description Find the number of the possible tuples of sequences (\(A_0,A_1,-,A_N\)) that satisfy all of the following conditions, modulo \(M\): ? Fo

AtCoder Beginner Contest 103 D(贪心)

AtCoder Beginner Contest 103 D 题目大意:n个点,除第n个点外第i与第i+1个点有一条边,给定m个a[i],b[i],求最少去掉几条边能使所有a[i],b[i]不相连. 按右端点从小到大排序,如果当前选的去掉的边在区间内,那么符合条件,否则ans++,并贪心地把去掉的边指向右端点,因为前面的区间都满足条件了,所以要去掉的边要尽量向右移使其满足更多的区间. 1 #include <iostream> 2 #include <cstdio> 3 #incl

AtCoder Regular Contest 098

AtCoder Regular Contest 098 C - Attention 题意 给定一个只包含"E","W"字符串,可以花一的花费使他们互相转换.选定一个位置,使位置左边的字符都变成E,右边都变成W所需要的最小花费. 分析 这题纯粹是签到题,做两个前缀和然后直接加就可以了. #include <iostream> #include <cmath> #include <cstring> #include <cstdi

AtCoder Regular Contest 095

AtCoder Regular Contest 095 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个A和Y个B最小花费使多少. 分析: 明显的发现肯定买性价比更高的方案,分情况讨论一下,如果\(a+b<=2*c\),那么明显的先买足c到A,B中较小的一个,然后再比较一下剩下的那个的单价和\(2*c\)的大小. A[ans=] -->|a+b<=2*c| B(A*a+B*b) A -->

AtCoder Regular Contest 094

AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几次操作将三个数变为相同的数. 分析: 可以发现如果三个数的奇偶性相同直接加就可以了,对于奇偶性不同的,先把奇偶性相同的两个数都+1,然后按照相同的处理就可以了.可以证明没有更好的方案. #include <bits/stdc++.h> using namespace std; int a,b,c,

Atcoder Regular Contest 103D Robot Arms

题意 在一个坐标系中有\(n\)个点,你每次从原点出发走\(m\)步,\(m <= 40\),每一次走的每一步步长需要相同,构造一种走法. 把每个坐标拆成二进制位,先不管正负,例如\(27 = 0000000000000000000000000011011_2\),我们从高到低删二进制位,如果这个数存在某一位,那么直接删掉就好了,不然就把除了最后一位之外全部取反. 当然我们优先删\(x, y\)中绝对值大的,因为删绝对值大的剩下的那个数就一定更小,那么这样我们可以保证\(x, y\)都能被删到\