11月11日と11月17日の週 牙をむいた情報オリンピック 〜解説編〜

この記事は約6分で読めます。

未来の人のためにこれを残しておきます

問題1

あなたはテストで 1 問 A 点の問題を 1 問正解し,1 問 300 点の問題を B 問正解した

あなたが正解した問題の点数の合計を出力せよ.

入力は以下の形式で与えられる.
A
B

「解説」

A点を一問、300点をB問正解しているので、合計は、A*1+(300*B)を出力できるといいね(^▽^)/

a = int(input()) ←ここで受け取り
b = int(input()) ←ここで受け取り
print(a + b * 300)

問題2

JOI 君はリンゴを買おうとしている.

リンゴを 1 個買うと X 円である.またリンゴを 2 個のセットで買うと,1 個 Y 円で (1 セットでは 2Y 円で) 買うことができる.ここで Y < X が成り立つ.

1 個と 2 個のセットを組み合わせて,リンゴを合計でちょうど N 個買うとき,支払う金額の最小値を求めよ.

入力は以下の形式で与えられる.
X   Y   N

「解説」

Y<Xってことはセット商品を買ったほうがお得になるってコト!?

ただ、多く買うことはできないので一番多くセット商品を計算する必要がでて来る

奇数かどうかの計算が面倒だなぁ、、、

if<コンニチワ

%<私を使うと偶数かどうか判別できるわ

わぁ心強い味方がいますね

では、やってみよう

x,y,n = map(int,input().split()) ←ここでそれぞれ三つ受け取る
if n % 2 == 0:         ←nを2で割ったあまりが0 つまり偶数の時
 print(2 * y * (n // 2))
else:             ←奇数の時
 print(2 * y * (n // 2) + x)

これでいいね!

情オリ<if使うのめんどくさいなぁそうに決まっている

↓情報オリンピックの回答

x, y, n = map(int, input().split())
print(x * (n % 2) + 2 * y * (n // 2))

   ↑もしnが奇数の時xを足す ↑もしnが奇数の時勝手に一個かける数を減らしてくれる                                                  (//は最大の整数だから)

やっぱ情オリはすげえ

問題3

JOI 国には N 棟のビルがある.i 番目 (1 ≦ i ≦ N) のビルの高さは Hi メートルである.

これらのビルのうち,高さが X メートル以上のものは何棟あるかを求めよ

入力は以下の形式で与えられる.
N   X
H1   H2   …   HN

「解説」

HN がX以上かすべてやればいいね

↓情オリの回答

n, x = map(int, input().split()) ←受け取り
h = list(map(int, input().split())) ←受け取り
ans = 0 ←何棟あるかのカウントするやつの元
for i in range(n): ←n回やれば、すべてできるね
if h[i] >= x: ←まさかh[i]の意味がわらないわけないよね?
ans += 1  ←超えているからカウントする
print(ans) 

今回の問題3は簡単だな

問題4

1 から N までの番号が付けられた N 人が運動会に参加した.運動会では,それぞれの人が走り幅跳びに M 回挑戦した.

人 i (1 ≦ i ≦ N) は j 回目 (1 ≦ j ≦ M) の走り幅跳びで Ai, j メートルの距離を跳ぶことに成功した.

それぞれの人について,その人の得点はその人が跳べた距離の最大値として定めるN 人の得点の合計を求めよ

入力は以下の形式で与えられる.
N   M
A1, 1   A1, 2   …   A1, M
A2, 1   A2, 2   …   A2, M

AN, 1   AN, 2   …   AN, M

「解説」

超簡単に言うと、一行目から(A1, 1   A1, 2   …   A1, M )から一番大きいやつを見つけて足すのを全てやれっていうこと 

やり方① for関数を使って一行目ずつ(A1, 1   A1, 2   …   A1, M )探し出して足していく

やり方② 一行ずつ(A1, 1   A1, 2   …   A1, M )をソートして大きいやつを取り出して足していく

やり方③ max関数を使って一行ずつ(A1, 1   A1, 2   …   A1, M )の大きいやつを足していく(情オリのやり方)

やり方①の方法

n,m = map(int,input().split()) ←受け取り
s = [[int(x) for x in input().split()] for _ in range(n)] ←受け取り
k = 0 ←足すやつ
for i in range(n):
 a = s[i][0] ←s[i][0]はマイナスの値にならないので、0でもいい
 for j in range(m): こっから
  if s[i][j] >= a: 
   a = s[i][j]   ここまでで、s[i]の最大を求める
 k += a       ここでたす
print(k)

やり方② 

n,m = map(int,input().split())
s = [[int(x) for x in input().split()] for _ in range(n)]
k = 0
for i in range(n):
 a = sorted(s[i]) ←ここでソートする(今回は昇順にしてるから、一番後ろからとっている)
 k += a[m – 1]  ←ここで足す
print(k)

やりかた③(情オリ)

n, m = map(int, input().split()) ←受け取り
ans = 0 足すためのやつ
for _ in range(n):
a = list(map(int, input().split())) 一行ごとに受け取り、aに代入する(maxのため)
ans += max(a) ansにaを足す
print(ans)

まとめ

今回のやつは、まだ簡単だから頑張ってほしい

あと打つのつかれた

コメント

タイトルとURLをコピーしました