Codefoces 525 A : Vitaliy and Pie
問題リンク : Problem - 525A - Codeforces
問題概要 :
2*n-2桁の文字列が与えられる
英小文字は鍵を表し、英大文字はドアを表す
鍵は同じ英文字のドアを開けることができる
ドアを開けたあとその鍵は消える
自分は文字列の一番左にいて、1マスずつ右へ進んでいく
ドアの場所に到達した時、そのドアを開けることができなければ1円払うことでそのドアを開けることができる
全てのドアを通過した際に何円かかるか
解法 :
書く
コメント :
ocaml練習用
1時間以上かかったし、とてもつらい
なぜコンパイルエラーになるのかもさっぱり分からないことが多くあるし、圧倒的知識&&理解不足
コード :
open Scanf;; open Printf;; let rec change list target cur value = (* listのtarget番目をvalueに変えたlistを返す *) if cur = target then value::( List.tl list ) else ( List.hd list )::( change (List.tl list ) target ( cur + 1 ) value );; let rec init size = if size <= 0 then [] else 0::( init ( size - 1 ) ) ;; let n = scanf "%d\n" ( fun n -> n );; let rec solve s i list = if i >= ( String.length s ) then 0 else begin if ( 'a' <= s.[i] && s.[i] <= 'z' ) then begin solve s ( i + 1 ) ( change list ( ( Char.code s.[i] ) - ( Char.code 'a' ) ) 0 ( 1 + ( List.nth list ( ( Char.code s.[i] ) - ( Char.code 'a' ) ) ) ) ) end else begin if ( List.nth list ( ( Char.code s.[i] ) - ( Char.code 'A' ) ) ) = 0 then begin 1 + solve s ( i + 1 ) list end else begin solve s ( i + 1 ) ( change list ( ( Char.code s.[i] ) - ( Char.code 'A' ) ) 0 ( ( List.nth list ( ( Char.code s.[i] ) - ( Char.code 'A' ) ) ) - 1 ) ) end end end ;; let s = scanf "%s\n" ( fun s -> s ) in printf "%d\n" ( solve s 0 ( init 26 ) );;