制約きっっっっっっっっつ…20敗
解き方(簡単なやつ)
まず覆面算に使われているアルファベットがいくつあるかカウントし、10個より多かったらUNSOLVABLE
と出力。
次にDFSで各アルファベットにどの数字を割り当てるか探索しチェック、見つかったらそれを変換して終了。
詳しいやり方ははまやんさんのユーザ解説を読むといいと思う。
普通に書いてみる
_____ _ _____ |_ _| | | ____| | | | | | _| | | | |___| |___ |_| |_____|_____| 残念!
考えたこと
- 型注釈をとりあえず全部のローカル変数につける
- 関数の引数をできるだけ減らす
- 辞書を配列に書き換える
- 時間計測して4.5secくらいかかってたらその時点で
UNSOLVABLE
する→失敗 - for文の順番を
1:10
から10:-1:1
に変更する→失敗 - よくアクセスするインデックスを変数に保存しておく
- ソースコード内でかわいくお願い♡する→成功?
- 人力ループアンローリングする→成功
- 成立しないときは早めに枝刈りする
おわりに
数か月ぶりに競プロしたら異次元になっててつらかった ペナ記録最多更新したかもしれん アスキーコードはLinuxにfiglet入れてやりました
ACコード
# _ _ ____ _ # _ __ | | ___ __ _ ___ ___ / \ / ___| | | # | '_ \| |/ _ \/ _` / __|/ _ \ / _ \| | | | # | |_) | | __/ (_| \__ \ __/ / ___ \ |___ |_| # | .__/|_|\___|\__,_|___/\___| /_/ \_\____| (_) # |_| # ----------solution---------- function main() s1,s2,s3=input(),input(),input() s11,s21,s31=s1[1],s2[1],s3[1] d::Vector{Char}=fill(' ',26) used::Vector{Char}=fill(' ',10) chara::Vector{Char}=sort(unique(s1*s2*s3)) l::Int=length(chara) if l>10 println("UNSOLVABLE") return end function check() # for i=10:-1:1 # used[i]!=' ' && (d[used[i]-'a'+1]='0'+i-1) # end if used[1]!=' ' d[used[1]-'a'+1]='0' end if used[2]!=' ' d[used[2]-'a'+1]='1' end if used[3]!=' ' d[used[3]-'a'+1]='2' end if used[4]!=' ' d[used[4]-'a'+1]='3' end if used[5]!=' ' d[used[5]-'a'+1]='4' end if used[6]!=' ' d[used[6]-'a'+1]='5' end if used[7]!=' ' d[used[7]-'a'+1]='6' end if used[8]!=' ' d[used[8]-'a'+1]='7' end if used[9]!=' ' d[used[9]-'a'+1]='8' end if used[10]!=' ' d[used[10]-'a'+1]='9' end if d[s11-'a'+1]=='0' || d[s21-'a'+1]=='0' || d[s31-'a'+1]=='0' return false end i1::Int=int(join([d[i-'a'+1] for i=s1])) i2::Int=int(join([d[i-'a'+1] for i=s2])) i3::Int=int(join([d[i-'a'+1] for i=s3])) if i1+i2!=i3 || iszero(i1) || iszero(i2) || iszero(i3) return false end println(i1) println(i2) println(i3) return true end function dfs(n::Int) if n==l+1 return check() end for i=10:-1:1 if used[i]==' ' used[i]=chara[n] if dfs(n+1) return true end used[i]=' ' end end return false end if !dfs(1) println("UNSOLVABLE") end end # --------input func---------- lines=readlines() input()=popfirst!(lines) int(s::AbstractString)=parse(Int,s) ints(s::AbstractString)=map(x->parse(Int,x),split(s)) ints(s::AbstractString,sp)=map(x->parse(Int,x),split(s,sp)) main()