タムログ

プログラミングについての情報発信をしていきます!

AtCoder Beginner Contest 164 B を Python で

AtCoder Beginner Contest 164 B を Python で解説していきます。
それでは,早速解説していきます。
まずは問題文から。


B – Battle


実行時間制限: 2 sec / メモリ制限: 1024 MB×

配点 : 200 点

問題文

高橋君と青木君がモンスターを闘わせます。

高橋君のモンスターは体力が A で攻撃力が B です。 青木君のモンスターは体力が C で攻撃力が D です。

高橋君→青木君→高橋君→青木君→… の順に攻撃を行います。 攻撃とは、相手のモンスターの体力の値を自分のモンスターの攻撃力のぶんだけ減らすことをいいます。 このことをどちらかのモンスターの体力が 0 以下になるまで続けたとき、 先に自分のモンスターの体力が 0 以下になった方の負け、そうでない方の勝ちです。

高橋君が勝つなら Yes、負けるなら No を出力してください。

制約

  • 1≤A,B,C,D≤100
  • 入力はすべて整数である。

入力

入力は以下の形式で標準入力から与えられる。

A B C D

出力

高橋君が勝つなら Yes、負けるなら No を出力せよ。


入力例 1

10 9 10 10

出力例 1

No

はじめに、高橋君の攻撃で青木君のモンスターの体力が 10−9=1 になります。

次に、青木君の攻撃で高橋君のモンスターの体力が 10−10=0 になります。

高橋君のモンスターの体力が先に 0 以下になったため、高橋君の負けです。


入力例 2

46 4 40 5

出力例 2 

Yes


解説

標準入力で A,B,C,D が与えられ,A から D を引き,C から B を引いていき,最終的にどちらが先に0以下になるかという問題です。

色々と方法は考えられますが,一番単純な while を使った解き方で説明していきます。
A > 0 または C > 0 であるという条件の下で,以下の試行を順に行っていきます。

  1. C から B を引く。
  2. C ≦ 0 なら,高橋君が青木君を攻撃して青木君の体力が0以下になったので,’Yes’を出力して終了する
  3. A から D を引く。
  4. A ≦ 0 なら,青木君が高橋君を攻撃して高橋君の体力が0以下になったので,’No’を出力して終了する

この1~4の操作をずっと続けていって,最終的にどちらかの体力が負になった時点で終了すればいいです。あとはこれをコーディングしていきます。
while 文の最中で操作を終了したいときは,break を使えばよいです。
それでは,解答例に移ります。

解答例

a,b,c,d = map(int, input().split())

while a > 0 or c > 0:
    c -= b
    if c <= 0:
        print('Yes')
        break
    a -= d
    if a <= 0:
        print('No')
        break

いかがだったでしょうか。
もしよろしければ,twitter のフォロー,いいね,RT よろしくお願いします!
こちらの励みになります😁
それでは!

AtCoder Beginner Contest 163 B を Python で

本日行われた AtCoder Beginner Contest 163 B を Python で解説していきます。
前回の ABC 162 の解説が中途半端な状態になっていてすみません😅
また後日解説を上げたいと思います。
それでは解説に移ります。まずは問題文から。
https://atcoder.jp/contests/abc163/tasks/abc163_b


B – Homework


行時間制限: 2 sec / メモリ制限: 1024 MB

配点 : 200 点

問題文

高橋君の夏休みは N 日間です。

夏休みの宿題が M 個出されており、i 番目の宿題をやるには Ai 日間かかります。

複数の宿題を同じ日にやることはできず、また、宿題をやる日には遊ぶことができません。

夏休み中に全ての宿題を終わらせるとき、最大何日間遊ぶことができますか?

ただし、夏休み中に全ての宿題を終わらせることができないときは、かわりに -1 を出力してください。

制約

  • 1≤N≤10^6
  • 1≤M≤10^4
  • 1≤Ai≤10^4

入力

入力は以下の形式で標準入力から与えられる。

N M
A1  AM

出力

高橋君が遊ぶことのできる日数、または、-1 を出力せよ。


入力例 1

41 2
5 6

出力例 1

30

例えば、最初の 5 日間で 1 番目の宿題をやり、その後 30 日間遊んで、最後の 6 日間で 2 番目の宿題をやることで、30 日間遊ぶことができます。


入力例 2

10 2
5 6

出力例 2

-1

宿題を終わらせることができません。


入力例 3

11 2
5 6

出力例 3

0

宿題を終わらせることはできますが、遊ぶことはできません。


入力例 4

314 15
9 26 5 35 8 9 79 3 23 8 46 2 6 43 3

出力例 4

9


解説

全ての宿題をやり終えた後に,残っている夏休みの期間はどれだけかという問題です。
宿題は並行してやれないということなので,A1~AM の全ての数の和が,宿題をやり終えるために必要な日数となります。
この数の和は,A をリストとして受け取ると,sum(A) で表すことができます。
よって,この和を N から引いた値が,残りの夏休みの期間となり,これを出力します。もし,この値が負になった場合は,夏休み中に全ての宿題を終わらせることができないということになるので -1 を出力します。
それでは,以下に解答例を載せておきます。

解答例

n,m = map(int, input().split())
a = list(map(int, input().split()))
 
ans = sum(a)
 
if  ans > n:
    print(-1)
else:
    print(n-ans)

いかがだったでしょうか。
もし分からないところなどがあれば,ぜひコメントしてくださいね!
他の問題も解説しているので,ぜひご覧ください。
それでは!

AtCoder Beginner Contest 162 B を Python で

AtCoder Beginner Contest 162 B を Python で解説していきます。
一緒に頑張っていきましょう!
まずは問題文から。
https://atcoder.jp/contests/abc162/tasks/abc162_b


B – FizzBuzz Sum


実行時間制限: 2 sec / メモリ制限: 1024 MB

配点 : 200 点

問題文

FizzBuzz列 a1,a2,… を次のように定めます。

  • i が 3 でも 5 でも割り切れるなら、ai=FizzBuzz
  • そうではなく i が 3 で割り切れるなら、ai=Fizz
  • そうではなく i が 5 で割り切れるなら、ai=Buzz
  • そうではないなら、ai=i

FizzBuzz列の N 項目までに含まれる数の和を求めてください。

制約

  • 1≤N≤10^6

入力

入力は以下の形式で標準入力から与えられる。

N

出力

FizzBuzz列の N 項目までに含まれる数の和を出力せよ。


解説

FizzBuzz の問題ですね。
ただ今回は FizzBuzz はそこまで関係なく,ただ N 項目までに現れる数字の和を出せばよいだけなので,1~Nまでの数字の中で3でも5でも割れない数の和を出します。

そのために,for ループを1~Nまでの数字でかませるように,

for i in range(1, N+1)

としてやります。
この i に対して,3でも5でも割り切れないなら,和を考えます。
3でも5でも割り切れないという条件は,3で割った余りも5で割った余りも0でないということですので,

i % 3 != 0 and i % 5 != 0

で記述できます。
あとはこのような条件を満たす i の和をとってやればよいです。
以下に解答例を載せておきます。

解答例

N = int(input())
 
ans = 0
for i in range(1, N+1):
    if i % 3 != 0 and i % 5 != 0:
        ans += i
 
print(ans)

いかがだったでしょうか。
自分は range の範囲を range(n) としてしまうという単純なミスをしてしまって WA になってしまいました。😱
やっぱり焦りは禁物ですね。反省です。(-_-;)
それでは!

AtCoder Beginner Contest 160 B を Python で

AtCoder Beginner Contest 160 B 問題を Python で解説していきたいと思います。
この問題は,問題文をよく読んでなくて WA 祭りになった苦い思い出がある問題です。😅
初心者でもわかりやすいように書いてみましたので,ぜひ見ていってください!
それではまずは問題文から。
https://atcoder.jp/contests/abc160/tasks/abc160_b


B – Golden Coins


実行時間制限: 2 sec / メモリ制限: 1024 MB

配点 : 200 点

問題文

高橋君は金色の硬貨が好きです。自分が持っている 500 円硬貨 1 枚につき 10005 円硬貨 1 枚につき 5 の 嬉しさ を得ます。

高橋君は X 円を持っています。これを高橋君の嬉しさが最大になるように両替したとき、高橋君の嬉しさはいくらになりますか?

(なお、利用できる硬貨は 500 円玉、100 円玉、50 円玉、10 円玉、5 円玉、1 円玉の 6 種類とします。)

制約

  • 0≤X≤109
  • X は整数

入力

入力は以下の形式で標準入力から与えられる。

X

出力

嬉しさの最大値を出力せよ。


解説

X 円 を上手く両替して,嬉しさの値を最大にするといった問題です。
500円玉一枚につき嬉しさが1000,5円玉一枚につき嬉しさが5ということなので,できるだけ500円を多く,次に5円玉が多くなるように両替したいということです。
500円玉の数を gold,5円玉の数を bronze としておきます。

まずは X 円 をできるだけ500円に両替したいと考えて,X を500で割った商を500円玉の数とします。これが500円玉の数の最大値になりますね。つまり
gold = X // 500
となります。

次に残ったお金をできるだけ5円玉に両替することを考えます。まずは X を500円玉に両替した後の値にするため,
X -= 500 × gold
とします。あとはこの X を先ほどと同様,できるだけ5円玉に両替することを考えて,X を5で割った商を5円玉の数とします。これが5円玉の数の最大値になりますね。つまり
bronze = X // 5
とすればよいです。

以上で gold と bronze が出ましたので,あとは500円玉一枚につき嬉しさが1000,5円玉一枚につき嬉しさが5ということから,嬉しさを出して出力してやればいいです。
以下が回答例です。

解答例

x = int(input())

gold = x // 500
x -= gold * 500

bronze = x // 5

print(gold*1000 + bronze*5)

いかがだったでしょうか。
最初に WA を出してしまった時ってなぜ間違っているのか分からなくてテンパってしまいますよね。(笑)
個人的には冷静になることの大事さが分かった問題でした。😅
それでは!

JSUTC202004 B

さて,前回に引き続きJSUTC202004 の B 問題を解説していきます。
今回は参加人数が少なくて,そのこともあってか処理速度がめちゃくちゃ速くなっててかなり驚きました(笑)。
ほんとに流石です。
では,解説していきます。
https://atcoder.jp/contests/judge-update-202004/tasks/judge_update_202004_b

B – Picking Balls


実行時間制限: 2 sec / メモリ制限: 1024 MB

配点 : 200 点

問題文

赤か青で塗られた N 個のボールが入った袋があります。また、それぞれのボールには整数が書かれています。

i 個目のボールには整数 Xi が書かれており、色は Ci が R のとき赤、B のとき青です。

高橋君は、袋の中にボールが残っている間、次の手順を繰り返して袋からボールを取り出します。

  • 袋の中に赤のボールがあるとき、残っている赤のボールのうち最小の整数が書かれたボールを袋から取り出す。そうでないとき、残っている青のボールのうち最小の整数が書かれたボールを袋から取り出す。

高橋君が各手順で取り出したボールに書かれていた整数を求めてください。

制約

  • 1≤N≤100
  • 1≤Xi≤10000
  • Ci は R または B
  • Xi≠Xj(i≠j)
  • N,Xi は全て整数

入力

入力は以下の形式で標準入力から与えられる。

N
X1 C1
X2 C2
:
XN CN

出力

高橋君が各手順で取り出したボールに書かれていた整数を出力せよ。

解説

袋の中に赤のボールが残っていればそのうちの最小の整数を出していき,赤のボールがなくなれば,今度は青いボールのなかの最小の整数を出していくということなので,結局赤いボールを小さい順に出力した後,青いボールを小さい順に出力してあげれば良いわけです。
そのためにまずボールに書かれている整数を昇順にソートした後に,RかBかでソートすればいいわけです。

解答

n = int(input())
# X,C の入力値をリストにして,それを a というリストに格納
a = []
for i in range(n):
    a.append(input().split())
    a[i][0] = int(a[i][0])

# 数値の昇順にソート
a.sort(key=lambda  x: x[0])

# R か B かでソートし,R が先に出るように降順でソート
a.sort(key=lambda  x: x[1] , reverse=True)

for i in range(n):
    print(a[i][0])

Atcoder ABC 161 B

Atcoder ABC 161 Bの問題をPythonで解説していきます。
https://atcoder.jp/contests/abc161/tasks/abc161_b

B – Popular Vote


実行時間制限: 2 sec / メモリ制限: 1024 MB

配点 : 200 点

問題文

N 種類の商品に対して人気投票を行いました。商品 i は Ai 票を得ています。

この中から人気商品 M 個を選びます。ただし、得票数が総投票数の 14M 未満であるような商品は選べません。

人気商品 M 個を選べるなら Yes、選べないなら No を出力してください。

制約

  • 1≤M≤N≤100
  • 1≤Ai≤1000
  • Ai は相異なる
  • 入力は全て整数

入力

入力は以下の形式で標準入力から与えられる。

N M
A1 … AN

出力

人気商品 MM 個を選べるなら Yes、選べないなら No を出力せよ。

解説

N種類の商品の中から得票数が総投票数の1/4M以上であるようなものをM個以上選べるかといった問題です。
まずは票数 A をリストで受け取り,それを大きい順にソートしてやります。
そしてそのソートしてあげたもののうち,上位M個の値がすべて総投票数の1/4M以上であればよいわけです 。
リスト A は大きい順にソートしてあるわけですから,結局リスト A の上から M 番目のものが総投票数の1/4M以上であれば,必然的にリスト A の上位 M 個の値は総投票数の1/4M以上となります。
従って,実装すべきことは

  • リスト A を降順にソートする
  • A の M 番目の値が総投票数の1/4M以上であるか判定し,そうであれば “Yes" を,そうでなければ “No" を出力する

ということになります。

k,m = map(int, input().split())
a = list(map(int, input().split()))

# リスト a の総投票数を s に格納する
s = sum(a)

# リスト a を降順にソートする
a.sort(reverse=True)

# リスト a の上から m 番目を判定する
if a[m-1] >= s*(1/4/m):
    print('Yes')
else:
    print('No')

AtCoder Beginner Contest 170 A を Python で

AtCoder Beginner Contest 170 A 問題を Python で解説していきたいと思います。
それでは,まずは問題文から。


A – Five Variables

実行時間制限: 2 sec / メモリ制限: 1024 MB×

配点 : 100 点

問題文

5 つの変数 x1,x2,x3,x4,x5 があります。

最初、変数 xi には整数 i が代入されていました。

すぬけくんは、これらの変数の中から 1 つを選んで、その変数に 0 を代入する操作を行いました。

すぬけくんがこの操作を行ったあとの 5 つの変数の値が与えられます。

すぬけくんが 0 を代入した変数がどれであったかを答えてください。

制約

  • 入力として与えられる x1,x2,x3,x4,x5 の値は、すぬけくんが操作を行ったあとのものとしてありえるものである。

入力

入力は以下の形式で標準入力から与えられる。

x1 x2 x3 x4 x5

出力

すぬけくんが 0 を代入した変数が xi であるとき、整数 i を出力せよ。


入力例 1

0 2 3 4 5

出力例 1

1

この場合、すぬけくんが 0 を代入した変数は x1 なので、1 を出力します。


入力例 2

1 2 0 4 5

出力例 2

3


解説

整数0~5の値が標準入力で渡されて,その中で0は何番目に渡されるかを出力せよという問題です。ここでは,整数をリスト型で受け取るとやりやすいでしょう。受け取った後に,for 文で回して,0になる番号を出力します。ここで注意するのは,for 文でまわす値はインデックス番号であり,これは0から始まる番号であるので,実際に出力する値(1~5)にするために,出力時にはインデックス番号に1を足した値を出力します。それでは,解答例に移ります。

解答例

x = list(map(int, input().split()))
 
for i in range(len(x)):
    if x[i] == 0:
        print(i+1)

いかがだったでしょうか。
リストで受け取るとやりやすいことが分かってもらえれば良いなと思います。
もし分からないところがあれば twitter で気軽にどうぞ。

少しでも参考になれば,twitter のフォロー,ファボ,RTよろしくお願いします。
それでは!