見出し画像

【ABC328】A~B問題解いてみた

こんにちは、海月(うみつき)です。
トヨタ自動車プログラミングコンテスト(ABC328)をやったので、その話をしようと思います。



A問題(Not Too Hard)

N 問の問題が出題されるプログラミングコンテストがあります。 i=1,2,…,N について、i 問目の配点は $${S_i}$$です。
配点が X 以下である問題すべての配点の合計を出力してください。

  • 入力される値は全て整数

  • 4≤N≤8

  • 100≤$${S_i}$$​≤675

  • 100≤X≤675

入力

N X
$${S_1}$$ $${S_2}$$ . . . $${S_N}$$

出力

答えを出力せよ

考えたこと

Xより小さいものを$${S_i}$$ の中から見つけ出して合計値を求めれば良いでうね。Sはリストに格納されているのでループさせて、あとは条件で合計値に加えるかどうかを判定しました。

コード

n, x = input().split()
s = input().split()

sum = 0
for score in s:
    if score <= x:
        sum += int(score)

print(sum)

B問題(11/11)

AtCoder 国では、1 年が N か月からなる暦を使っています。 i 月 (1≤i≤N) は、i 月 1 日から i 月 $${D_i}$$​ 日までの $${D_i}$$​ 日からなります。
AtCoder 国において、1 年のうち日付がゾロ目になる日が何日あるか求めてください。
ただし、i 月 j 日 (1≤i≤N,1≤j≤$${D_i}$$​) の日付がゾロ目になるとは、1 種類の数字だけを用いて i と j を十進法で表すことができることをいいます。

  • 1≤N≤100

  • 1≤$${D_i}$$​≤100 (1≤i≤N)

  • 入力はすべて整数

入力

N
$${D_1}$$ $${D_2}$$ . . . $${D_N}$$

出力

答えを出力せよ。

考えたこと

11/11 に関連してるなぁ(ポッキーの日)
10/10 や12/12 はゾロ目ではないことに注意が必要です。
条件から、1月でゾロ目になるのは、1日と11日のみであることがわかります。(1≦$${D_i}$$≦100より)

1月を例に取ると、$${D_1}$$ の値が1より大きければゾロ目は+1、$${D_1}$$ の値が大きければゾロ目は+1とすれば良いのでは?と考えました。
($${D_1}$$ が1~10のときはゾロ目は1つ、$${D_1}$$ が11~のときはゾロ目は2つとなるため)

実は、11月以上のときも同じことが言えるんですよね。。(これに気づくのに時間かかった)
11月のときも、$${D_1}$$ の値が"1"より大きければゾロ目は+1、$${D_1}$$ の値が11よりも大きければゾロ目は+1とすれば良いということですね。
11/1もゾロ目なので。(ここをプログラムにするのに時間かかりました。。)

そのため、月数が10以上なのか、そうではないのかによって場合分けをしました。

月数をループさせて、条件をつけていき、ゾロ目となる日が何日あるかを数えようとしました。
月数が10以上かつ11の倍数ではないものは、ゾロ目とならないので省きました。
条件としては以下で考えています。

  • 月数(month) が $${D_i}$$ より大きい(1/1、2/2などが存在する)

  • 月数(month)月数(month)(つまり1月なら11、2月なら22) が $${D_i}$$ より大きい(1/11、2/22などが存在する)

  • 11の倍数で2桁の月における日数が1桁のとき (11/1、22/2などが存在する)

また、月数の始まり(1から)と、リストの始まり(0から)が異なるので、

month += 1

として調整しました。

コード

n = int(input())
d = list(map(int, input().split()))

ans = 0

for month in range(n):
    if ((month+1)>=10) & ((month+1)%11!=0):
        continue
    if ((month+1)) <= d[month]:
        #print("{}/{}".format(month+1,d[month]))
        ans += 1
    if (month+1) + (month+1)*10 <= d[month]:
        ans += 1
    if ((month+1)>=10) & ((month+1)%11==0):
        #11の倍数の月
        if d[month] >= month/11:
            ans += 1

print(ans)

感想とか

C問題は手がつけれんかった。。。
AとBができたので最低限という感じです。
やっぱCまで解けないと茶はきついよね、ということで頑張ります。

海月でした
それでは、また〜

この記事が気に入ったらサポートをしてみませんか?