[これがコードテスト]2グリディ


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

  • 現在の状況では、今すぐ良い村を選ぶ方法
  • は、最小限のソリューションを考え出す能力を必要とする
  • 題の解法は正当性分析です!->最良に見えるものを繰り返し選択するだけで、最良の解を見つけることができます.
  • (ex)
  • 一般的に、グリディアルゴリズムは最適解を保証できないことが多い.
    しかし,符号化試験ではGriddyアルゴリズムの問題の大部分がGriddyで解く最適解である.推論してこそ解くことができる.
  • 金をさがす


    あなたはレストランの会計を手伝っている人です.カウンターにはお釣りに使える500元、100元、50元、10元のコインが無限に存在します.
    お客様におつりをあげるのはN元の時にお探しになるコインの最低個数です.
    しかし、探しているお金Nはいつも10の倍数です.
  • の最適解を求めるために、最大の通貨単位からお金を探せばいい
  • <正当性分析>


    なぜ
  • 最大の通貨単位からお金を探し始めたのですか?->持っているコインの中で、大きい単位はいつも小さい単位の倍数です.
  • .
    n = 1260
    count = 0
    
    # 큰 단위의 화폐부터 차례대로 확인하기
    array = [500, 100, 50, 10]
    
    for coin in array:
        count += n // coin # 해당 화폐로 거슬러 줄 수 있는 동전의 개수 세기
        n %= coin # 화페로 나눈 나머지 n에 대입
    
    print(count)
    
  • 通貨種がKの場合、時間的複雑度はO(K)
  • である.
  • 時間の複雑さは金額に関係なく、コインの総種類にのみ影響します.
  • <問題>1まで

    # 내 풀이 -> 시간 오래걸림..
    import sys
    n,k=map(int,sys.stdin.readline().split())
    cnt=0
    
    while n>1:
        if n%k!=0:
            n-=1
            cnt+=1
            
        else:
            n=n//k
            cnt+=1
    
    print(cnt)
    import sys
    n,k=map(int,sys.stdin.readline().split())
    result=0
    while True:   
        target=(n//k)*k # n이 k로 나누어 떨어지지 않을 때, k의 배수에서 n보다 작은 수를 target에 넣음 
        result+=(n-target) # 1빼주는 연산 수행 횟수를 result에 더함.
        n=target
    
        if n<k:
            break
    
        result+=1 # 
        n=n//k 
    
    result+=(n-1)
        
    print(result)
  • は、できるだけ多くのタスクを実行します.
  • <問題>乗算または加算


    「1文字列Sが与えられ、各数字の桁数が
  • (0から9)の場合、左から右にかけてすべての数字を順番にチェックし、数字の間に」×' または、「+」演算子を使用してプログラムを作成し、結果が生成される可能性のある最大数:
  • を求めます.
  • セグメント、より大きい×通常の先に計算する方法とは異なり、すべての演算が左から右に順次行われる
  • であると仮定する.
    たとえば、02984文字列を作成できる最大数は((0+2)× 9) × 8) × 4)=576.また、入力された最大値はで、常に20億個未満の整数です.

    私の答え

  • はグレディ解を用いず,文字列は表で表された後,状況解に分けられる.
  • import sys
    s=sys.stdin.readline()
    num_list=[]
    result=1
    
    
    for num in s[:-1]: # 문자열을 배열로 분배.
        num_list.append(int(num))
    
    num_list.sort() # 
    
    if num_list[0]==0 or num_list[0]==1: # 첫 배열의 항목이 0, 1인 경우 예외 처리 
        result=num_list[0]+num_list[1]
        num_list=num_list[2:]
    
    for num in num_list:
        result*=num
    print(result)

    コーディングテストの回答

    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)

    <問題>冒険者組合:問題の説明

  • ある村にはN人の冒険者がいる.冒険者組合はN人の冒険者に対して「恐怖度」テストを行い、「恐怖度」の高い冒険者は恐怖を感じやすく、危険な状況では対応能力が
  • 低下した.
  • 冒険者ギャング職人の董斌氏は、安全に冒険者グループを結成するために、恐怖度Xの冒険者はX人以上の冒険者グループに参加しなければ旅行を出発できないと規定した.
  • 東彬は、最大何人の冒険者グループを構築できるか知りたい.N名の冒険者の情報を得た場合は,旅行可能なグループ数の最高額
  • を求めるプログラムを作成する.
  • 、例えばN=5とすると、各冒険者の恐怖度は以下のようになる.
    ' 2 3 1 2 2 '
  • の場合、1組目に恐怖度1,2,3の冒険者を入れ、2組目に恐怖度2の残りの2名を入れることで、2つの組み合わせ
  • を作成することができる.
  • にはいくつかの冒険者が村に残ることができるので、すべての冒険者を特定のグループに置く必要はありません.
    내 풀이
    import sys
    
    cnt=0
    n=int(sys.stdin.readline())
    data=list(map(int,sys.stdin.readline().split()))
    data.sort()
    
    
    
    while len(data)!=0:
        max_fear=data.pop()
        if max_fear==1:
            cnt+=data.count(1)+1
            break
        else:
            data=data[0:-max_fear+1]
            cnt+=1
        print(data)
    
    
    print(cnt)
    출제자 풀이
    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) # 총 그룹의 수 출력