「ARC103D」ロボットアーム「の構造」

問題の意味

与えられた\(N \)ポイント、あなたは、適切な見つける必要がある\(m個\)\(D_1、D_2、...、D_m \)をそれぞれが4つの方向に行くために、原点から始まるように、\(D_I \)単位、最終的に到達\((X_T、Y_t)を\) 出力\(Mの\)\(D \)アレイとするための\(T = 1 \ n個の \) 出力方向。

\(N- \ 1当量3 ^ 10 \) レンジ座標\を(10 ^ 9 \)

問題の解決策

もしポイント\((X_T、Y_t)\)、\ (X_T + Y_t \)がないソリューション、異なるパリティの

場合\は(X_T + y_t \)でもあり、私たちみましょう\(D_1。1 = \) これに変換\(X_T + y_t \)が奇数です。

行うにはどのように奇妙な?バイナリ構造。

:検討\(D(K)= { 1、2、4、...、2 ^ K} \) そのようなセットは、すべて行くことができる| X | + | Y \( | \当量2 ^ {kは-1 + 1} \)点(奇数)

証明:https://blog.csdn.net/qq_37555704/article/details/83217444#_14ここでは、マップを移動しました。

ため\(D(K) - D (K-1)\) 領域(新しいゾーン)、(紫赤色以上)ステップに直接行きます

元の領域に到達することができ、私たちは内側から内側に行くことができます。

:解決策を見つける方法を考えてみましょう。

証明:\(D(K)が\)ポイント満足に来ることができる\(\分(| X | 、| Y |)\当量2 ^ K-1 \)

おそらく値証明(| = 2 ^ K \ \ X | = 2 ^ K-1、| | y)を調整好ましくない見出さに運ば。

限り、我々から各として\(D(k)は\)行き(D(K-1)\を \) するために、することができ(D(0)\)\成功するとき

分析を描くことによって、大きな絶対値の各々は、より小さくすることができる\(D(K)\)来る\(D(1-K)を\)

その後、問題がなくなっています。私たちの上にあります\(D(k)は\)行ってきました\(\ dは(K-1))は、実際に他の方法で回避され、その文字の出力が否定さに注意を払います。

#include <algorithm>
#include <cstdio>
using namespace std;

const int N = 1010;

int n, m, x[N], y[N], d[N];
bool tg[N];

int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++) {
        scanf("%d%d", x + i, y + i);
        tg[(x[i] + y[i]) & 1] = 1;
    }
    if(tg[0] & tg[1]) return puts("-1") & 0;
    if(tg[0]) d[++ m] = 1;
    for(int i = 30; ~ i; i --) d[++ m] = 1 << i;
    printf("%d\n", m);
    for(int i = 1; i <= m; i ++) printf("%d%c", d[i], " \n"[i == m]);
    for(int i = 1; i <= n; i ++, putchar('\n')) {
        for(int j = 1; j <= m; j ++) {
            if(abs(x[i]) > abs(y[i])) {
                if(x[i] > 0) x[i] -= d[j], putchar('R');
                else x[i] += d[j], putchar('L');
            } else {
                if(y[i] > 0) y[i] -= d[j], putchar('U');
                else y[i] += d[j], putchar('D');
            }
        }
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/hongzy/p/11519389.html