土下座しながら探索中

主に競技プログラミング

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 ) );;