✍ 220106 PS


CH1. ギリシャ問題
🗨 乗算または加算
1つの文字列Sが与えられ、各位置が数字(0から9)のみで構成されている場合、左から右に順にすべての数字をチェックし、数字の間に「x」または「+」演算子を加えて、最大数のプログラムを生成する.通常+ではなくxを先に計算する方法とは異なり,すべての演算が左から右に順次行われると仮定した.
入力条件
  • の第1行には、複数の数字からなる文字列Sがある.(1<=S長<=20)
  • しゅつりょくじょうけん
    第1行
  • で作成できる最大数を出力します.
  • 👆 1回目の解では,数字が1のときにプラス記号が乗数より大きいことを考慮せず,0のみを考慮した.つまり、数字が0か1であれば加算し、残りは乗算して最大数を生成する方法です.
    プールコード
    data = input()
    
    result = int(data[0])
    
    for i in range(1,len(data)):
        num = int(data[i])
        if num<=1 or result<=1:
            result+=num
        else:
            result*=num
    
    print(result)
    
    🗨 反転文字列
    マルチシスには0と1のみからなる文字列Sがある.多順はこの文字列Sのすべての数字を同じにしたいと思っています.多順でできることは、S上で1つ以上の連続した数字をつかんで、すべてひっくり返すことです.反転は、1が0になり、0が1になることを意味します.
    例えば、S=0001100の場合:
    1.ひっくり返すと1110011です.
    2.4文字目を5文字目に反転すると、その文字は11111になり、2回ですべて同じ数字になります.
    ただし、最初から4文字目から5文字目に文字を反転させると、一度に00000に変換でき、一度にすべての文字を同じ数字に変換できます.
    文字列Sが与えられると、マルチシスが実行しなければならない最小オペランドを出力します.
    入力条件
  • の第1行では、文字列Sは0および1のみから構成される.Sの長さは100万未満である.
  • しゅつりょくじょうけん
  • 第1行は、マルチシスが実行しなければならない最小動作数を出力する.
  • 👆 最初のアイデアは,先頭の数字と残りの数字を比較し,他の数字が現れた場合,その後も他の数字が現れるかどうかを決定し,countを増やす方向と考えることである.
    結局、答えはもっと簡単で正確だと思いますので、答えに従いました.
    プールがすべて0に変更された場合、count数を1と比較して、より小さい数を返します.
    data = input()
    count0=0        #모두 0으로 바꾸는 경우 
    count1=0        #모두 1으로 바꾸는 경우
    
    if data[0]=='1':
        count0+=1
    else:
        count1+=1
    
    #두 번째 원소부터 모든 원소를 확인하며
    for i in range(len(data)-1):
        if data[i]!=data[i+1]:
            if data[i+1]=='1':
                count0+=1
            else:
                count1+=1
    print(min(count0,count1))
    🗨 作成できない金額
    団地のコンビニの店主の東彬さんはN個のコインを持っています.このとき、N個のコインでは生成できない整数の中で最大値を求めるプログラムを作成してください.
    例えば、N=5とすると、各硬貨はそれぞれ3元、2元、1元、1元、9元(通貨単位)硬貨である.これは東彬が創造できない純金額の中で最も高い8元です.
    入力条件
  • 第1行は、硬貨の個数を表す正の整数Nを与える.(1<=N<=1,000)
  • 行目には、各硬貨通貨単位を表すN個の自然数が与えられ、各自然数はスペースで区切られている.この場合、各通貨単位は1000000以下の自然数となります.
  • しゅつりょくじょうけん
  • は、第1行目に与えられた硬貨から生成できない整数金額のうちの最大値を出力する.
  • 👆 通貨単位を昇順に並べ替えて、小さい単位から作成できる金額をリストし、その値に大きな単位を追加して、作成できる金額を決定します.答えは簡単ですから、それを使いましょう.
    targetは作成可能かどうかを確認するための金額です.targetと通貨単位を比較する場合、通貨単位がtargetより大きい場合、targetは作成できない最小値になるためbreak.そうでなければtargetに通貨単位を加えます.
    n = int(input())
    data = list(map(int,input().split()))
    data.sort()
    
    target=1
    for x in data:
    	if target<x:
        	break
        target+=x
        
    print(target)
    
    🗨 ボウリングを選ぶ
    A,B二人でボーリングをしています.二人は重さの違うボウリングを選びたいです.全部でN個のボウリングがあり、ボウリングごとに重さがあり、ボールの番号は1から順番に並べられています.同じ重さのボールは複数あるが、異なるボールと見なすことができる.ボウリングの重量は1~Mの自然数で存在する.
    例えば、Nが5、Mが3であり、各ボールの重量が1、3、2、3、および2の順である場合、各ボールの番号は1〜5である.2人が選択できるボウリング番号の組み合わせを求めます.
    (1号、2号),(1号、3号),(1号、4号),(1号、5号),(2号、3号、5号),(3号、4号、5号),(4号、5号)
    結局、2人がボールを選んだのは8種類だった.ボールごとにN個の重量がある場合は、2人でボウリングを選択する数を計算するプログラムを作成してください.
    入力条件
  • の最初の行では、ボウリングの個数N、ボールの最大重量Mがスペースで区切られ、自然数の形で与えられる.(1<=N<=1,000, 1<=M<=10)
  • 行目では、ボウリング毎の重量Kがスペースで区切られ、順番に自然数で与えられる.(1<=K<=M)
  • しゅつりょくじょうけん
    1行目の
  • で、2人でボウリングを選択した場合、数字が出力されます.
  • 👆 最初はボールが見えなかった最大範囲Mの範囲は1~10で、二重forゲートで実現しただけです.参考解答では、Mの範囲は1〜10であるため、リストを用いて各重量に何個のボウリングが存在するかを記録し、各重量に何個のボウリングが存在するかを記録することで、二重操作を必要としないことが分かった.
    n,m = map(int,input().split())
    data = list(map(int,input().split()))
    
    #1부터 10까지 무게를 담을 수 있는 리스트
    array = [0]*11
    
    for x in data:
    	#무게를 array index로 이용하여 각 무게에 해당하는 볼링공의 개수를 카운트.
        array[x]+=1
        
    result=0
    for i in range(1,m+1):
    	n-=array[i]		#무게가 i인 볼링공의 개수(A가 선택할 수 있는 개수)제외
        	result+=array[i]*n	#B가 선택하는 경우의 수와 곱하기.
    print(result) 
    🗨無知な食いしん坊生活
    質問:https://programmers.co.kr/learn/courses/30/lessons/42891
    👆 中断時間Kを簡単に0にするだけで、1番から順番に消化します.しかし、この方式は3番の条件を満たすことはできません.離すときは最低でもお尻で離す.
    import heapq
    
    def solution(food_times, k):
        # 전체 음식을 먹는 시간보다 k가 크거나 같다면 -1
        if sum(food_times) <= k:
            return -1
    
        # 시간이 작은 음식부터 빼야 하므로 우선순위 큐를 이용
        q = []
        for i in range(len(food_times)):
            # (음식 시간, 음식 번호) 형태로 우선순위 큐에 삽입
            heapq.heappush(q, (food_times[i], i + 1))  
    
        sum_value = 0 # 먹기 위해 사용한 시간
        previous = 0 # 직전에 다 먹은 음식 시간
        length = len(food_times) # 남은 음식의 개수
    
        # sum_value + (현재의 음식 시간 - 이전 음식 시간) * 현재 음식 개수와 k 비교
        while sum_value + ((q[0][0] - previous) * length) <= k:
            now = heapq.heappop(q)[0]
            sum_value += (now - previous) * length
            length -= 1 # 다 먹은 음식 제외
            previous = now # 이전 음식 시간 재설정
    
        # 남은 음식 중에서 몇 번째 음식인지 확인하여 출력
        result = sorted(q, key=lambda x: x[1]) # 음식의 번호 기준으로 정렬
        return result[(k - sum_value) % length][1]  
    この问题の答えは完全に理解していません...まず、Pythonの操作はまだ熟練していないと思いますので、Pythonの文法をマスターしてから問題を作る必要があります.
    グリディ問題をもう一度解いてこそ、問題の解き方に慣れることができるようだ.問題は問題を見て答えが思いつかないことです...