11399、11047、4296、1439、1080(標準)


11399 ATM問題


入力
1行目は人数N(1≦N≦1000)を与える.2行目は一人一人がお金を引き出すのに必要な時間Piを与えます.(1 ≤ Pi ≤ 1,000)
しゅつりょく
1行目は、1人あたりの引き出しに要する時間のプロトコルの最大値を出力します.
  • 入力値をリストに入れて並べ替えます
  • ソート後の値は、ダブルfor文によってインデックスごとの時間値
  • を算出する.
    出力
  • 総時間の和
  • import sys
    input = sys.stdin.readline
    
    N = int(input())
    N_list = list(map(int,input().split()))
    Result_list = [ 0 for _ in range(N) ]
    N_list = sorted(N_list)
    Result=0
    for i in range(N):
        for j in range(i+1):
            Result_list[i] += N_list[j]
    for i in range(N):
        Result += Result_list[i]
    print(Result)
    11047硬貨0
    質問する
    ジュンギュが持っているコインは全部でN種類で、どれもたくさんあります.
    硬貨を適当に使って、その価値の和をKにします.必要なコインの数の最大値を求めるプログラムを作成してください.
    入力
    第1行はNとKを与える.(1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)
    2行目から、N行目では昇順にコインの価値Aiが与えられる.(1≦Ai≦100000,A 1=1,i≧2の場合、AiはAi-1の倍数)
    しゅつりょく
    Kドルを作るのに必要なコインの数の最大値を1行目に出力します.
  • の大まかな論理は、k元を大きなコインから差し引くことである.
  • 大硬貨で控除する場合、負数は控除できないので、次の小硬貨:
  • に移動します.
  • でなければ、残りのk値(現在の硬貨の値*で割ったシェア)を減算することができます.
  • import sys
    input = sys.stdin.readline
    N, K = map(int, input().split())
    coin_list = [ int(input()) for _ in range(N)]
    coin_index = N-1
    result = 0
    while(True):
        if K == 0:
            break
        elif K - coin_list[coin_index] < 0: # 뺄 수 없을 때 
            coin_index -= 1               # coin_index를 -1하고 continue
            continue
        else: # 뺄 수 있을 때
            quotient = K//coin_list[coin_index] # 남은 값을 동전으로 나눈 몫
            result += quotient
            K -= quotient * coin_list[coin_index]
            coin_index -= 1
            continue
    
    print(result)
    ##4796キャンプ
    登山家の金剛山さんは家族と一緒にキャンプに行きました.しかし、キャンプ場には以下の警告文が書かれている.
    キャンプ場は20日間連続で10日間しか利用できません.
    江山は28日間の休暇を取ったばかりだ.今度の休暇期間中、江山のキャンプ場は何日間使えますか?
    江山はもう少し普通に問題を解きたいと思っている.
    キャンプが続くP日の中で、L日しか使えません.江山さんはまだV休暇を取ったばかりだ.江山は最大何日キャンプ場を露出することができますか?(1 < L < P < V)
    入力
    入力は、複数のテスト・インスタンスから構成されます.各試験箱は、L、P、Vの順に1行で構成されている.すべての入力整数はint範囲です.最後の行は3つのゼロを与えます.
    しゅつりょく
    試験箱ごとに、江山はキャンプ場を最大数日の出力をサンプル出力として使用することができる.
    import sys
    input = sys.stdin.readline
    case_cnt = 0
    while(True):
        case_cnt += 1
        
        L, P, V = map(int, input().split())
        # L,P,V가 모두 0일 시, 프로그램 종료
        if L == 0 and P == 0 and V == 0: 
            break
    
        # 총 휴가를 P로 나누고, 사용가능 한 일 수인 L * 몫을 result에 저장한다 
        quotient = V // P
        result = quotient * L
    
        # 남은 휴가가 L보다 클 경우 L을 result에 더해주고,
        # 작을 경우 남은 휴가를 result에 더해준다.
        if V - (quotient * P) > L:
            result += L
        else:
            result += V - (quotient * P)
        print("Case %d:"%case_cnt,result)
    ##1439反転
    マルチシスは、0と1のみからなる文字列Sを有する.多順はこの文字列Sのすべての数字を同じにしたいと思っています.マルチシスはSの連続する1つ以上の数字をつかんで、それからすべてひっくり返すことができます.反転は1を0に、0を1にすることを意味します.
    例えば、S=0001100の場合、
    全体的にひっくり返すと1110011です.
    4文字目から5文字目を反転すると111111になり、2文字目ですべて同じ数字になります.
    ただし、最初から4文字目から5文字目に文字を反転させると、1回に1億円に変換でき、1回目ですべて同じ数字に変換できます.
    文字列Sが指定されている場合は、マルチシスが実行しなければならない最小操作回数を出力します.
    入力
    最初の行は文字列Sを与える.Sの長さは100万未満である.
    しゅつりょく
    最初の行は多順で行うべき最小限の行動回数を出力します.
  • for文でインデックスにアクセスします.インデックス-1の値と現在のインデックスの値が異なる場合、cntは1
  • 増加します.
  • 偶数の場合は2で割った値を出力し、奇数の場合は2で割った値+1を出力します.
  • 髪これでいいですよね?だから試してみましたが、本当に不思議でした.
  • import sys
    input= sys.stdin.readline
    
    bit_list = list(map(int, input().strip()))
    len = bit_list.__len__()
    cnt = 0
    
    for i in range(1,len):
        if bit_list[i] == bit_list[i-1]:
            continue
        else:
            cnt += 1
    
    if cnt%2 == 0:
        print(cnt//2)
    else:
        print(cnt//2 + 1) 
    ##1080マトリックス
    質問する
    0と1のみからなる行列Aと行列Bがある.このとき、マトリクスAをマトリクスBに変換するために必要な演算回数の最大値を求めるプログラムを作成する.
    変換マトリクスの演算には、次の3つがあります.×3部分行列のすべての要素を反転します.(0 → 1, 1 → 0)
    入力
    第1行は、行列のサイズN Mを与える.NおよびMは50以下の自然数である.2行目からN行はマトリクスAを与え、次の行からN行はマトリクスBを与える.
    しゅつりょく
    最初の行に問題の答えを出力します.AをBに変換できない場合は、-1を出力します.
  • これは残念ながら検索して解けました
  • をもう少し考えればいいのに...
  • import sys
    input = sys.stdin.readline
    
    N, M = map(int, input().split())
    A = [ list(map(int, input().strip())) for i in range(N) ]
    B = [ list(map(int, input().strip())) for i in range(N) ]
    cnt = 0
    flag = 0
    def transition(i,j):
        global cnt
        cnt += 1
        for a in range(i,i+3,1):
            for b in range(j,j+3,1):
                if A[a][b]==1:
                    A[a][b]=0
                else:
                    A[a][b]=1
    
    for a in range(N-2):
            for b in range(M-2):
                if A[a][b] != B[a][b]:
                    transition(a,b)
    
    for i in range(N): # 변환 후 일치하는지 확인
        for j in range(M):
            if A[i][j] != B[i][j]:
                flag = 1
                break
    
    if flag == 1:							# 변환이 불가능 하면 -1 반환
        print(-1)
    else:
        print(cnt)