Atcoderが主催するABC003の問題を解答します。
A問題
解答
1 2 3 4 5 6 7 8 |
import math #小数点切り捨てのため n = int(input()) #nに入力値を代入 ans = 0 # for i in range(1,n+1): #入力値の数だけループ ans = ans + (i*10000)/n #前回のループの計算結果(変数ans)と(給料の金額:i*10000)×(確率:1/n)を足して変数ansに代入 print(math.floor(ans)) #小数点以下を切り下げ |
10000*(1/6)+20000*(1/6)+30000*(1/6)+40000・・・=35000円
C問題
方針
問題文より、小さい順から足して2で割ることを繰り返していくことで答えを求められそうです。
nは動画の数、kは視聴できる数を表しています。
k=1の場合はレーティングが最大の値を2で割ればよいです。
それ以外の場合は、レーティングを昇順に並び替え、大きい方からk個の値を取り出し、小さい順に足して2で割ることを繰り返していきます。
解答
解答1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
n,k = map(int,input().split()) r = list(map(int,input().split())) #昇順ソート r = sorted(r) #最大値からk個分取り出す x =r[-k:] #kが1の場合は最大値÷2を計算 if k==1: print(max(r)/2) exit() #kが2以上の場合は、xの要素数(=k)だけ足して2で割ることを繰り返す else: tmp = 0 for i in range(k): tmp = (tmp+x[i])/2 print(tmp) print(tmp) |
解答2
1 2 3 4 5 6 7 8 9 10 11 12 |
n,k = map(int,input().split()) r = list(map(int,input().split())) r = sorted(r) if k==1: print(max(r)/2) exit() else: tmp = 0 for i in range(n-k,n): tmp = (tmp+r[i])/2 print(tmp) print(tmp) |
他の方の回答ですが、こちらの方がわかりやすくて無駄がないですね。
わざわざ最大値からk個分取り出して別のリストに保存しなくとも、元のレーティングのリストをそのまま使うことができます。
コメント