[2021易可泰]2GRADY&実装


GRADY&実装


[2021易可泰]2GRADY&実装

グレースケールアルゴリズム

  • 階調アルゴリズム(貪欲法)とは、現在の状況において、現在選択されている方法、すなわち
  • のみを指す.
  • の典型的な階調アルゴリズムは、
  • が最小限の解題構想を考え出すことを要求する.
  • グリディ解法の正当性解析が重要である.
  • 最良の内容を繰り返し選択するだけで最良の結果が得られるかどうかを確認します.
  • 通常、グリンディアルゴリズムは、最適解
  • を保証できないことが多い.
  • しかし符号化試験におけるGriddy問題の大部分は貪欲法で得られた年が最良の年となった場合に
  • を提出する.

    質問:おつり



    問題解決策

  • の最適解を迅速に得るために、最大の通貨単位からお金を探せば
  • になります.
  • N元を探す必要がある場合は、最初に500元を探すことができます.
  • 以降、100元、50元、10元の硬貨は順番に探せます.探せばいいです.
  • 最大の通貨単位からお金を探して最適な年を保証できる理由は?
  • が保有する硬貨のうち、大きい単位は常に小さい単位の倍数であるため、小さい単位の硬貨を総合して他の年を出すことができず、
  • n = 1260
    count = 0
    
    # 큰 단위의 화폐부터 차례대로 확인하기
    array = [500, 100, 50, 10]
    
    for coin in array:
        count += n // coin # 해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
        n %= coin
    
    print(count)
    for coin in array:
        count += n // coin
        n %= coin

    質問:1まで



    問題解決策

  • 所与のNに対してできるだけ多くの分割を実行すればよい
  • .
  • Nの値を減少すると、2つ以上の除算動作を減少する数は、1を減算する動作
  • よりはるかに多い.
  • 可能であれば、できるだけ多くの仕事を割り当てることで、常に最適な年数を確保することができますか?
  • Nの付与がどれほど大きいかにかかわらず、Kに分割し続けると、
  • を幾何級数で急速に減少させることができる.
  • すなわち、Kが2より大きい限り、Kを1で割ることは、常に1を減算するよりも速くNを減算することになる
  • 、Nは常に1(最適年数)
  • に達する
    # N, K를 공백을 기준으로 구분하여 입력 받기
    n, k = map(int, input().split())
    
    result = 0
    
    while True:
        # N이 K로 나누어 떨어지는 수가 될 때까지 빼기
        target = (n // k) * k
        result += (n - target)
        n = target
        # N이 K보다 작을 때 (더 이상 나눌 수 없을 때) 반복문 탈출
        if n < k:
            break
        # K로 나누기
        result += 1
        n //= k
    
    # 마지막으로 남은 수에 대하여 1씩 빼기
    result += (n - 1)
    print(result)
    while True:
        target = (n // k) * k
        result += (n - target)

    質問:乗算または加算



    問題解決策

  • ほとんどの場合、「x」は「+」よりも価値があります.
    例えば、5+6=11;5 x 6=30
  • 2 2 2つの数のうち1つだけが「0」または「1」の場合、加算は乗算よりも効率的です.
    したがって、2つの数に対して演算を実行する場合、2つの数のうちの1つの数が1未満の場合、加算され、両方の数が2より大きい場合、正解
  • が乗算される.
    data = input()
    
    # 첫 번째 문자를 숫자로 변경하여 대입
    result = int(data[0])
    
    for i in range(1, len(data)):
        # 두 수 중에서 하나라도 '0' 혹은 '1'인 경우, 곱하기보다는 더하기 수행
        num = int(data[i])
        if num <= 1 or result <= 1:
            result += num
        else:
            result *= num
    
    print(result)

    質問:冒険者ギルド



    問題解決策

  • 昇順に並べられた後、恐怖度が最も低い冒険者から
  • を逐一確認する.
  • から恐怖度を1つずつ確認し、「現在の組合せの冒険者数」が「現在の確認の恐怖度」以上である場合は
  • に設定する.
  • この方法を利用して、恐怖度は昇順に並べられて、いつも最小限の冒険家の数だけを含んで、組み合わせ
  • を構成しました.
    n = int(input())
    data = list(map(int, input().split())
    data.sort()
    
    result = 0 # 총 그룹의 수
    count = 0 # 현재 그룹에 포함된 모험가의 수
    
    for i in data: # 공포도를 낮은 것부터 하나씩 확인
        count += 1 # 현재 그룹에 해당 모험가를 포함
        if count >= i: # 현재 그룹에 포함된 모험가의 수가, 현재의 공포도 이상이라면 그룹 결성
            result += 1 # 총 그룹의 수 증가시키기
            count = 0 # 현재 그룹에 포함된 모험가의 수 초기화
    
    print(result) # 총 그룹의 수 출력
    result += 1
    count = 0

    インプリメンテーション

  • 実施とは、頭の中のアルゴリズムをソースコードに変換するプロセス
  • を指す.
  • でよく見られるアルゴリズム大会では、実装タイプの問題は何を意味しますか?
  • プールは簡単な問題ですが、ソースコードに移行するのは難しいです.
  • 実施形態例
  • アルゴリズムは簡単ですが、コードが長すぎる問題
  • の実数演算を処理する特定の小数点以下の桁数に出力する必要がある問題
  • .
  • 文字列が特定の基準に従って切断され、処理する必要がある問題
  • 問題
  • は、一般にアルゴリズム問題において2次元空間表現マトリクス
  • を用いる.
  • シミュレーションと完全ナビゲーションの問題では,2次元空間における方向ベクトルは
  • をよく用いる.

    質問:上下左右



    問題解決策

  • この問題は要求通りに
  • を実施することができる.
  • シリーズコマンドによれば、オブジェクトは順番に移動し、シミュレーション(Simulation)タイプに分けられ、典型的な問題タイプは実装である.
  • しかし、アルゴリズム教材や問題解決サイトが異なるため、符号化テストにおけるシミュレーションタイプ、実装タイプ、完全ブラウズタイプは多くの類似点しかないので、
  • を覚えておいてください.
    # N 입력 받기
    n = int(input())
    x, y = 1, 1
    plans = input().split()
    
    # L, R, U, D에 따른 이동 방향
    dx = [0, 0, -1, 1]
    dy = [-1, 1, 0, 0]
    move_types = ["L", "R", "U", "D"]
    
    # 이동 계획을 하나씩 확인하기
    for plan in plans:
        # 이동 후 좌표 구하기
        for i in range(len(move_types)):
            if plan == move_types[i]:
                nx = x + dx[i]
                ny = y + dy[i]
            # 공간을 벗어나는 경우 무시
            if nx < 1 or ny < 1 or nx > n or ny > n:
                continue
            # 이동 수행
            x, y = nx, ny
    
    print(x, y)
    dx = [0, 0, -1, 1]
    dy = [-1, 1, 0, 0]
    move_types = ["L", "R", "U", "D"]
    if plan == move_types[i]:
        nx = x + dx[i]
        ny = y + dy[i]

    質問:視点



    問題解決策

  • この問題は
  • です.
  • 日は86400秒で、00:00秒から23:59分59秒までの場合は86400種類あります
  • 24 60 60 = 86,400
  • したがって、
  • は、視野角を1だけ大きくするだけで、3が含まれているかどうかを判断することができる.
  • これらのタイプは「完全ナビゲーション」問題タイプと呼ばれています.
  • 、これは探索方法がすべての可能な数を検査できることを意味する(
  • )
    # H 입력 받기
    h = int(input())
    
    count = 0
    for i in range(h + 1):
        for j in range(60):
            for k in range(60):
                # 매 시각 안에 '3'이 포함되어 있다면 카운트 증가
                if '3' in str(i) + str(j) + str(k):
                    count += 1
    
    print(count)
    if '3' in str(i) + str(j) + str(k):
        count += 1

    質問:王室の夜



    問題解決策

  • 問題
  • 夜の8つのパスを1つずつチェックし、各場所が移動可能かどうかを確認します.
  • リストを使用して8方向の方向ベクトル
  • を定義する.
    # 현재 나이트의 위치 입력받기
    input_data = input()
    row = int(input_data[1])
    column = int(ord(input_data[0])) - int(ord('a')) + 1
    
    # 나이트가 이동할 수 있는 8가지 방향 정의
    steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)]
    
    # 8가지 방향에 대하여 각 위치로 이동이 가능한지 확인
    result = 0
    for step in steps:
        # 이동하고자 하는 위치 확인
        next_row = row + step[0]
        next_column = column + step[1]
        # 해당 위치로 이동이 가능하다면 카운트 증가
        if next_row >= 1 and next_row <= 8 and next_column >= 1 and next_column <= 8:
            result += 1
    
    print(result)
    column = int(ord(input_data[0])) - int(ord('a')) + 1
    
    steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)]
    for step in steps:
        next_row = row + step[0]
        next_column = column + step[1]

    質問:文字列の並べ替え



    問題解決策

  • 問題
  • 文字列を入力すると、1文字ずつチェックされます.
    数字が
  • の場合は、
  • も計算されます.
  • 文字の場合、
  • として保存されます.
  • の結果、リストに格納されているアルファベットを並べ替えて出力し、合計を後ろに貼り付けると、正解
  • が得られます.
    data = input()
    result = []
    value = 0
    
    # 문자를 하나씩 확인
    for x in data:
        # 알파벳인 경우 결과를 리스트에 삽입
        if x.isalpha():
            result.append(x)
        # 숫자는 따로 더하기
        else:
            value += int(x)
    
    # 알파벳을 오름차순으로 정렬
    result.sort()
    
    # 숫자가 하나라도 존재하는 경우 가장 뒤에 삽입
    if value != 0:
        result.append(str(value))
    
    # 최종 결과 출력 (리스트를 문자열로 변환하여 출력)
    print(''.join(result))
    if x.isalpha():
        result.append(x)
    print(''.join(result))