A – Six Characters
方針
・入力された文字列を保存した変数”s”の値を別の変数”S”に保存
→”S”は文字列の長さが6に達したかを判定するために使用
→”s”は”S”の文字列の長さが6未満の場合に、もう一度文字列を結合するために使用
→変数を2つ用意するのは、結合されて長くなった文字列を再結合することを防ぐため
・”S”の長さが6になるまで以下の操作を繰り返す
・”+”を用いて”S”に”s”を結合
解答
コード+コメント
1 2 3 4 5 6 7 8 9 10 |
#input()関数で入力を受け取り、変数sに代入 s=input() #S(大文字)にs(小文字)を代入 S = s #Sの長さが6未満の場合 ※len()により引数(カッコの中身)の要素数(長さ)を取得できる while len(S)<6: #Sにsを結合した値をSに保存:Sがabcabc、sがabcの場合、S+s→ abcabc + abc、 S = S+s → abcabcabc S = S+s #Sを区切り文字なしで出力 print(*S,sep="") |
コード
1 2 3 4 5 |
s=input() S = s while len(S)<6: S = S+s print(*S,sep="") |
参考
Pythonで文字列を結合する方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン
B – At Most 3 (Judge ver.)
方針
・おもりは3つまで選ぶことができる(1つ、2つでも良い)
・N個の重りから1個,2個,3個のそれぞれを選ぶパターンに分けて調べる
・おもりを選んだ時、その重さの合計がW以下であれば良い
・おもりの重さの合計は、おもりの選び方によっては2回以上出てくる可能性がある
→良い整数として一度数えた重さの合計は連想配列(辞書)に記録しておく
・重さの合計がW以下であり、初出現であれば良い整数としてカウントする
解答
コード・コメント
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#組み合わせを列挙するためのライブラリ from itertools import combinations #入力 n,w = map(int,input().split()) A = list(map(int,input().split())) #解答用の変数 ans = 0 #おもりの和が2回目出た時に重複して数えないように、出現した和を管理する(いわゆる連想配列:辞書) dict = {} #おもりを1つ選ぶ場合 for i in A: #選んだおもりの重さの合計(ここでは1つしか選んでいないが)がW以下であり、その和が初出現の場合 if i<w and not(i in dict): #おもりの和を良い整数として解答用の変数に1つ加える ans += 1 #次回以降、おもりの和として同じ値が出てきたときに被りで数えないようにするため、出現した印を立てる dict[i] = 1 #おもりを2つ選ぶ場合 #冒頭のライブラリからcombinationsを使って組み合わせを全て列挙する combination = list(combinations(A,2)) #組み合わせをi,jに代入し、判定 for i,j in combination: #選んだ2つのおもりの合計をtmp_sumに代入 tmp_sum = i+j #選んだおもりの重さの合計がW以下であり、その和が初出現の場合 if tmp_sum <= w and not(tmp_sum in dict.keys()): #おもりの和を良い整数として解答用の変数に1つ加える ans += 1 #次回以降、おもりの和として同じ値が出てきたときに被りで数えないようにするため、出現した印を立てる dict[tmp_sum] = 1 #おもりを3つ選ぶ場合 #冒頭のライブラリからcombinationsを使って組み合わせを全て列挙する combination = list(combinations(A,3)) #組み合わせをi,j,kに代入し、判定 for i,j,k in combination: #選んだ3つのおもりの合計をtmp_sumに代入 tmp_sum = i+j+k #選んだおもりの重さの合計がW以下であり、その和が初出現の場合 if tmp_sum <= w and not(tmp_sum in dict.keys()): #おもりの和を良い整数として解答用の変数に1つ加える ans += 1 #次回以降、おもりの和として同じ値が出てきたときに被りで数えないようにするため、出現した印を立てる dict[tmp_sum] = 1 #解答を出力 print(ans) |
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
from itertools import combinations n,w = map(int,input().split()) A = list(map(int,input().split())) ans = 0 dict = {} for i in A: if i<w and not(i in dict): ans += 1 dict[i] = 1 combination = list(combinations(A,2)) for i,j in combination: tmp_sum = i+j if tmp_sum <= w and not(tmp_sum in dict.keys()): ans += 1 dict[tmp_sum] = 1 combination = list(combinations(A,3)) for i,j,k in combination: tmp_sum = i+j+k if tmp_sum <= w and not(tmp_sum in dict.keys()): ans += 1 dict[tmp_sum] = 1 print(ans) |
C – Poem Online Judge
方針
①オリジナルな文字列とは初めて出現した各文字列のこと
→1度しか出現していない文字列ではない
②オリジナルな文字列の中で最も高い点数が、何番目に提出されたかを出力する
③オリジナルな文字列の中で最も高い点数が、2つ以上存在する場合は、早い方の提出順を出力する
解答
コード+コメント
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
""" ①オリジナルな文字列とは初めて出現した各文字列のこと →1度しか出現していない文字列ではない ②オリジナルな文字列の中で最も高い点数が、何番目に提出されたかを出力する ③オリジナルな文字列の中で最も高い点数が、2つ以上存在する場合は、早い方の提出順を出力する """ from collections import Counter from collections import defaultdict #入力 n = int(input()) #提出回数を記録 apper_dict =defaultdict(int) #点数の記録 point_dict = {} #出現順の記録 speed_dict = {} #オリジナルかどうかの記録 flag_dict = {} #提出された回数nだけ繰り返す for i in range(n): #入力 s,t = input().split() #tを文字列から整数へ変換 t = int(t) #文字列の提出回数を1増やす(これは不要) apper_dict[s]+=1 #初提出の場合は得点を記録。2回目以降の提出では何もしない if not(s in flag_dict.keys()): #文字列をキー、tを値として辞書に得点を記録 point_dict[s]=t #文字列をキー、i+1(ループ回数。ループは0から始まるが提出順は1から数えるため1を加える) speed_dict[s]=i+1 #文字列をキー、1を値として出現した印をつける flag_dict[s]=1 #最高得点を記録する変数を初期化 now_point = 0 #得点を記録した辞書のキーに対して繰り返し実行 for i in point_dict.keys(): #前回のループでの最高得点を一時保存 pre_point = now_point #最高得点を更新 now_point = max(now_point,point_dict[i]) #最高得点が変化していない場合は何もしない。③対策 if pre_point == now_point: pass #最高得点が変化した場合 else: #その文字列をkeyに記録 key = i #オリジナルな文字列の中で最高得点(同点の場合は最速)の文字列はkeyに保存されている。 #速さを記録した辞書からその提出順を出力する print(speed_dict[key]) |
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
from collections import Counter from collections import defaultdict n = int(input()) apper_dict =defaultdict(int) point_dict = {} speed_dict = {} flag_dict = {} for i in range(n): s,t = input().split() t = int(t) apper_dict[s]+=1 if not(s in flag_dict.keys()): point_dict[s]=t speed_dict[s]=i+1 flag_dict[s]=1 now_point = 0 for i in point_dict.keys(): pre_point = now_point now_point = max(now_point,point_dict[i]) if pre_point == now_point: pass else: key = i print(speed_dict[key]) |
その他
参加メモ
A問題を解いた後、B問題で題意を読み解けずC問題へ
C問題もTLEを2回出してB問題へ戻るが、やはりB問題が解けずC問題へ
TLEのネックになっていたと思われる部分を修正してAC
B問題は1,2,3個のそれぞれを選択する3パターンに分けた探索を行うが間に合わず終了
コメント