AtCoder練習日誌_ABC143

またしても過去問です。

今回はABC143。

高橋君の家の窓の横方向の長さはAであり、横方向の長さが Bのカーテンが 2枚取り付けられています。(カーテンは縦方向には窓を覆うのに十分な長さがあります。)

窓のうちカーテンで隠されていない部分の横方向の長さが最小になるようにカーテンを閉めます。 このとき、窓のカーテンで隠されていない部分の合計の横方向の長さを求めてください。

https://atcoder.jp/contests/abc143/tasks/abc143_a
A,B = map(int, input().split())
#B = int(input())

if A <= 2 * B:
  print(0)
else:
  print(A-(2*B))

ただの条件分岐でイケます。

 

続いてB問題

問題文

たこ焼きフェスティバル (たこフェス) の季節がやってきました!
今年のたこフェスではN個のたこ焼きがふるまわれる予定です。このうち i個目のたこ焼きのおいしさはdiです。
ところで、おいしさがxとyであるたこ焼きを一緒に食べると、体力がx×y回復することが一般に知られています。
たこフェスでふるまわれるN個のたこ焼きから、2個を選ぶ方法はN×(N−1)/2通り考えられます。そのそれぞれについて、一緒に食べたときの体力の回復量を求めて、その総和を出力してください。

制約

入力は全て整数である。
2≤N≤50
0≤di≤100

https://atcoder.jp/contests/abc143/tasks/abc143_b

これは素直にN×(N-1)/2回計算して和を求めたほうが良さそうです。

n = int(input())
d = list(map(int, input().split()))
sum = 0
for i in range(n):
  for j in range(i+1,n):
    sum += d[i] * d[j]
#    print(i,j,sum)
 
print(sum)

これはNの最大値が50なので計算量が50×49/2=2450であるから解けます。

Nが10000とかだったら死んでます。たこ焼き50こしか振る舞わねーのかよというツッコミはしないように。

 

C問題

N匹のスライムが横一列に並んでいます。これらの色に関する情報が、長さNの英小文字から成る文字列Sで与えられます。左からi番目のスライムは、Sのi文字目に対応する色を持っています。
同じ色を持ち隣接するスライムは融合し、色は変わらずに1匹のスライムとなります。このとき、融合した後のスライムは、融合する前の各スライムが隣接していた他のスライムと隣接した状態になります。

最終的に存在するスライムは何匹となるでしょうか。

https://atcoder.jp/contests/abc143/tasks/abc143_c

単純に同じ文字列が続いたらカウントしないで、別の文字列になったらカウントする方法で解けそうです。

n = int(input())
S = str(input())
cnt = 1
num =0
for i in range(n):
  if S[num] != S[i]:
    num = i
    cnt += 1
#  print(i,S[i])
print(cnt)

とりあえず、ここまで。

C問題までは割と優しい回だったみたいですね。

コメント