M-SOLUTIONS プロコンオープン 2020にバーチャル参加しました。
ABCDの4問ACでした。
Python3を使用しています。
A問題
ifで条件分岐させます。
import sys
def input():
return sys.stdin.readline()[:-1]
def main():
X = int(input())
if X >= 1800:
print(1)
elif X >= 1600:
print(2)
elif X >= 1400:
print(3)
elif X >= 1200:
print(4)
elif X >= 1000:
print(5)
elif X >= 800:
print(6)
elif X >= 600:
print(7)
else:
print(8)
if __name__ == "__main__":
main()
B問題
条件を満たすまで操作を行い、操作回数がK以下であれば魔術を成功させられたと考えます。
これは入力されるA、B、C、Kが小さいために可能です。
M君は数字を2倍にする操作を行うため、最も小さい数となるべきAに操作を行わないことが分かります。
つまり、Aの値が固定された状態で考えます。
while文で、BがAより大きくなるように操作を行います。
これにより、Bの値が固定されます。
同様にwhile文でBより大きいCを求めることができます。
import sys
def input():
return sys.stdin.readline()[:-1]
def main():
A, B, C = map(int,input().split())
K = int(input())
count = 0
while A >= B:
B = B * 2
count += 1
while B >= C:
C = C * 2
count += 1
if count <= K:
print("Yes")
else:
print("No")
if __name__ == "__main__":
main()
C問題
この問題は、前学期より評点が高いが低いか判定する必要があるだけで、実際の評点を求める必要はありません。
N学期の評点はA[0]*A[1] ~ *A[N-1]で求められます。
N+1学期の評点はA[1] ~ *A[N-1]*A[N]で求められます。
評点の高低を比較するだけなので、A[0]とA[N]を比較するだけで十分です。
これをfor文で繰り返し、N-K個の結果を表示します。
import sys
def input():
return sys.stdin.readline()[:-1]
def main():
N, K = map(int,input().split())
A = list(map(int,input().split()))
for i in range(N - K):
if A[i] < A[i + K]:
print("Yes")
else:
print("No")
if __name__ == "__main__":
main()
D問題
株価が低いときに買って、株価が高いときに売りたいというのが基本的な目標です。
まずi番目とi+1番目を比較し、大きくなっていれば1、小さくなっていれば-1というリストを作ります。 (リスト内包表記の利用)
1のときは買えるだけ買います。
1が続くということは株価が上がっていくということなので、一番初めに1になった地点で買えばOKです。
同様に-1になったときは全ての株を売ります。
-1が続くということは株価が下がっていくということなので、一番初めに-1になった地点で売ればOKです。
import sys
def input():
return sys.stdin.readline()[:-1]
def main():
N = int(input())
A = list(map(int,input().split()))
zougen = [-1 if A[i] > A[i + 1] else 1 for i in range(N - 1)]
money = 1000
kabu = 0
for i in range(N-1):
if zougen[i] == 1:
kabu += money // A[i]
money = money % A[i]
else:
money += kabu * A[i]
kabu = 0
print(A[-1] * kabu + money)
if __name__ == "__main__":
main()