【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
入力
出力
答えを出力せよ
考えたこと
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)
入力はすべて整数
入力
出力
答えを出力せよ。
考えたこと
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まで解けないと茶はきついよね、ということで頑張ります。
海月でした
それでは、また〜
この記事が気に入ったらサポートをしてみませんか?