LoginSignup
0
0

More than 1 year has passed since last update.

ABC221 C - Select Mul が解けた + おまけ B 問題

Last updated at Posted at 2021-10-02

abc221_1.png
abc221_2.png
abc221_3.png
abc221_4.png

全探索すれば、"0" が頭とか関係ないかな。
今回は最大値が欲しいわけだし。

あとは、入力を文字で受け取って
桁の中央で分割し、掛け併せて最大値を炙り出す。

SelectMul.py
N = list(input())

from itertools import permutations
ans = 0
for i in permutations(N,len(N)):
    nums = list(i)
    A = int( "".join(nums[:len(N)//2]))
    B = int( "".join(nums[len(N)//2:]))
    if ans < A*B:
        ans = A*B
print(ans)

入力を中央を分割した A,B を掛けたら最大値になる根拠は
特に自分の中になかったが、そこは雰囲気で対応した。
運がよかったのかな。

おまけ

高々1 回 ではなく、2回以上なら No という風に
書いて WA を引いた。

そう、敗因は隣り合う要素について高々1回なのだ。
残念。

当日は以下で通った。

typo_r0.py
S = list(input())
T = list(input())
S_ = sorted(S)
T_ = sorted(T)
for a, b in zip(S_, T_):
    if a != b:
        print("No")
        exit()

cnt = 0
i = 0
lis = []
for s, t in zip(S, T):
    if s != t:
        lis.append(i)
        cnt += 1
        if cnt > 2:
            print("No")
            exit()
    i += 1

for i in range(len(lis)-1):
    if lis[i+1]-lis[i] != 1:
        print("No")
        exit()

print("Yes")

B で WA を引くと焦る
持ち直すために一個一個潰しながら丁寧に書いている様が見て取れる(笑)
後日、周囲の回答を読んで
面白い記述があったのでチラ見したあと、
イメージしながら書いてみた。

type_r1.py
S = list(input())
T = list(input())

for i in range(len(S)-1):
    if S[i] != T[i]:
        if S[i] == T[i+1] and S[i+1] == T[i]:
            if i+1 == len(S)-1 or S[i+2:] == T[i+2:]:# <= ココ
                print("Yes")
                exit()
            else:
                print("No")
                exit()
        else:
            print("No")
            exit()
print("Yes")

上記のコメントにあるココが素晴らしかった。
具体的には S[i+2:] == T[i+2:]
交換後した以降の文字列が一致してたら print("Yes").
その通りだよなー

勉強になりました m(_ _)m


C もやり直したが B もやり直した。
連続する 2 文字に関して、S,T ともに
異なる場合は、1 反転させる。
念のため反転回数は数えておく。

反転回数が 2 回以上なら必然的に No
反転回数が 1 回以下で、かつ S == T なら Yes.

以下のような回答も書いてて面白いと思った。

abc221c.py
S = list(input())
T = list(input())
cnt = 0
def check(S,T):#S==T or S != T を確認
    for s,t in zip(S,T):
        if s != t:
            return False
    return True

for i in range(len(S)-1):#連続する文字が異なる場合、反転
    if S[i] != T[i] and S[i+1] != T[i+1]:
        if S[i] == T[i+1] and S[i+1] == T[i]:
            T[i],T[i+1] = T[i+1],T[i]
            cnt += 1 #<= 反転回数を数える

if cnt <= 1 and check(S,T):
    print("Yes")
else:
    print("No")
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0