ABC310の解説

ABC310のA~C問題の解説をしようと思います

(A~Cなので需要ナシかも…)

A問題 Order Something Else

当然のことだと思いますが、以下の二つの金額を比べて、その小さい方の値を採用します。
・ジュースを定額で買うときの値段。
・ジュースと料理を買って、割引券を使うときの値段。

このとき、ジュースを定額で買うのは一通りの金額しかありませんが、割引券を使うときはどの料理を注文するかで金額が変わってきます。もちろん、すべての料理の場合の金額を全探索して、その中で一番金額が低いものを採用するのでもいいのですが、もっと簡単に最安値を求める方法があります(といってもたいしたことではないです…)。

買うことができる料理の中で、一番安い料理を買ったときが、割引券を使う中で一番金額が低くなります(←当たり前…)。
ですので、定価でそのまま買ったときと、一番安い料理を買って割引券を使ったときの金額を比べて、そのうちの小さい方の値を採用するのでよいです。

Pythonでの例

n,p,q=map(int,input().split())
d=sorted(list(map(int,input().split())))
print(min(p,q+d[0]))

B問題 Strictly Superior

この問題は、全探索をすることによって解くことができます。iとjの値を全探索して、上位互換を探します。
入力されたデータは二次元リストなどに格納するといいと思います。難しいアルゴリズムを使うわけではないのですが、実装するのが少し大変かも???(僕の友達は茶コーダーですが、これ解いたのコンテストが始まってから74分でした)

Pythonの例

n,m=map(int,input().split())
rotti = [[0] * 2 for i in range(n)]
ans=1
for i in range(n):
  rotti[i]=list(map(int,input().split()))
for i in range(n):
  for ipp in range(n):
    if i == ipp:
      continue
    check=0
    for k in range(rotti[i][1]):
      if not rotti[i][2+k] in rotti[ipp][2:len(rotti[ipp])]:
        check=1
        break
    if check==1:
      continue
    if rotti[i][0]>rotti[ipp][0]:
      ans=0
      break
    elif len(rotti[ipp])>len(rotti[i]) and rotti[i][0]>=rotti[ipp][0]:
      ans=0
      break
  if ans==0:
    break
if ans==0:
  print("Yes")
else:
  print("No")

C問題 Reversible

それぞれの文字列をルールをつけて、Set型に入れます。ルールというのは、どんなルールでも大丈夫だとは思いますが、自分がやったのはこのようなルールでした。

・それぞれの文字列は、そのままのときと反転させたとき、辞書順で見たときに小さい方に変換する。

こうすることによって、反転したら同じ文字列になるようなものは、すべて同じ文字列になります。これをSet型に入れて、最後にSet型の要素数を出力すればよいです。

Pythonの例

n=int(input())
irane=set()
for i in range(n):
  hako=input()
  new=""
  for ipp in range(len(hako)):
    new=new+hako[len(hako)-1-ipp]
  irane.add(min(hako,new))
print(len(irane))

最後までありがとうございました。

↓自分の書いたページをまとめているところ
rotti-coder.hatenablog.com