---
# System prepended metadata

title: 実装方針

---

# 実装方針
## 問題
・2d + 1 個のブロックが直線上に並び
　便宜上、中央のブロックを0 として、-d, -d + 1, ..., -1, 0, 1, ..., d - 1, d のようにブロックに番号が振られています。
・最初は、0 のブロックにうなぎが立っています。
・以下の操作をn 回繰り返します。
　1. 画面に1 以上の整数a が表示されるので、右か左の同一方向に連続してa 個のブロック分だけうなぎを動かします。
　2. -d のブロックからさらに左に進むか、もしくはd のブロックからさらに右に進むと、うなぎはブロックから落下し蒲焼きになります。
　3. 蒲焼きになると強制的にゲームは終了し、あなたの負けです。
・上記操作のあと、うなぎが蒲焼きになっていなければあなたの勝ちです。

□ □ □ □ □ □ □ □ □ □ □ □ □ □



## アイデア
* 総当たり
    * いったん総当たりで最適化する方向の方が良さそう。
* ~~右と左をみて、近い方に毎回移動する。落ちるなら遠い方に移動~~
    * 遠い方で移動しても落ちるのであれば不可能
    * これだと、うまく端に移動しないといけないパターンがあると失敗する
* きている数字を２グループに分け、その差分がブロックの数以下にすることが絶対条件
    * その後、途中で落ちない組み合わせを探す
    * ２グループに分けること自体相当時間がかかりそう。


### 総当たりコードの方針
N回

## 茶位メモ


### 方針
* 全ての操作に対して総当たりしたらできそう。
    * 再起関数でできそう

### コード

``` python=
d, n = [int(n) for n in input().split()]
action_num_list = [int(input()) for _ in range(n)]
stage_start = 0
stage_end = 2*d
start_position = d

def optimize_lr(_position, _action_num_list, _action_lr_list) :
    if _position < stage_start or _position > stage_end:
        return
    if len(_action_num_list) == 0 :
        print(''.join(_action_lr_list))
        exit()
    _action_num = _action_num_list[0]
    optimize_lr(_position+_action_num, _action_num_list[1:], _action_lr_list+['L'])  # Lを選択
    optimize_lr(_position-_action_num, _action_num_list[1:], _action_lr_list+['R'])  # Rを選択
    
optimize_lr(start_position, action_num_list, [])
```

``` python=
d, n = [int(n) for n in input().split()]
action_num_list = [int(input()) for _ in range(n)]
stage_start = 0
stage_end = 2*d
start_position = d

def optimize_lr(_position, _action_num_list, _action_lr_list) :
    if _position < stage_start or _position > stage_end:
        return
    if len(_action_num_list) == 0 :
        print(''.join(_action_lr_list))
        exit()
    _action_num = _action_num_list[0]
    if _position < d:
        optimize_lr(_position+_action_num, _action_num_list[1:], _action_lr_list+['R'])  # Rを選択
        optimize_lr(_position-_action_num, _action_num_list[1:], _action_lr_list+['L'])  # Lを選択
    else:
        optimize_lr(_position-_action_num, _action_num_list[1:], _action_lr_list+['L'])  # Lを選択
        optimize_lr(_position+_action_num, _action_num_list[1:], _action_lr_list+['R'])  # Rを選択
    
optimize_lr(start_position, action_num_list, [])
```

## 柳田メモ
``` python=



```  

## 尾崎メモ
``` perl=
for( my $i = 0; $i < 2; $i++ ){
    if()
}

sub _move {
    my 
}
```





## あらたにメモ




---
## C#erメモ
ゲーム木作成
```csharp=
using System;
using System.Linq;
using System.Collections.Generic;

public class Pz{
    // -1 : left 
    //  1 : right
    public static int Range;
    public static int[] result;
    
    public static void Main(){
        Range = int.Parse(Console.ReadLine());
        var input = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
        
        var res = BruteForce(input, 0, new int[0]);
        Console.WriteLine(string.Join(", ", result));
        
    }
    
    public static bool BruteForce(int[] command, int pos, int[] moved){
        
        if (pos < -Range || pos > Range)
            return false;
        
        
        if (command.Length == 0)
            return true;
        
        if (BruteForce(command.Where((s, i) => i != 0).ToArray(), pos + command[0], moved.Concat(new int[]{ 1 }).ToArray())){
            result = moved.Concat(new int[]{ 1 }).ToArray();
            return true;
        }
        
        if (BruteForce(command.Where((s, i) => i != 0).ToArray(), pos - command[0], moved.Concat(new int[]{ -1 }).ToArray())){
            result = moved.Concat(new int[]{ -1 }).ToArray();
            return true;
        }
        return false;
        
    }
    
}

// よし、わからん
/**
 * 20
 * 5 9 8 13 12 8 7 11 2 3 14 11 1 2 2 1 2 1 2 1 1 18
 */
```




