JOIが開催されました

この記事は SYSKEN Advent Calendar 2015 14日目の記事です。
2年のるっちです。先日にJOIが開催されたので、私もシス研の一人として参加しました。
その時の感想や解き方などを書き連ねていこうと思います。

さて、JOIに参加したのですが、私はC++という言語を使用しました。そして、とりあえず思ったことがあります。

STL強い。

STLって何ぞ?と思われる方のために簡潔に説明すると、C++をもっと便利に使うための拡張機能のようなものです。言ってしまえば、<iostream>をincludeするのは必須ですが、<vector>や<algorithm>はincludeしなくてもコンパイルは通りますし、ごく普通に機能させることも可能です。ですが、STLは使った方が確実に便利です。使える場面ならぜひ使いましょう。

stl2

何といっても、
・配列の要素数をその場その場で自由に変更できる<vector>
・面倒な値の並び替えとか値の交換とかを関数一つで終わらせられる<algorithm>
これらの関数は競技中に非常に役立ちました。(この二つしか使ってませんが…)

素人なりに解説したところで、まずは一問目です。
要は「最初の4つの値のうち、値の大きい3つを足し、その後の2つの値のうち、値の大きい方をさらに足す」といったものです。
要素数4の配列、要素数2の配列を宣言した後、値を順に代入し、どちらも昇順に並べて、for文回して3回と1回足して、出力して終わりです。

と、淡々に書き流しましたが、何か面倒な処理が混ざっていることに気付いた方がいるかもしれません。
昇順に並べるの面倒じゃね?
そうなんです。昇順に並べるの、面倒なんです。(*個人の感想です)
なんか値と値を比較して、もし値の大小がどうのこうのなら値格納用変数に格納だのなんだの…
一年生の頃は面倒で面倒で仕方がありませんでした。

…ですが、<algorithm>をincludeしてsort関数を使えばあら不思議。
一行で昇順に並び替えてくれます。

sort

sort関数、強い。

さて次は二問目です。
要は「i(0<i<=n)番目の値とi+1番目の値を2(1<=m<=100)で割り、余りがi>i+1だった場合はi番目の値とi+1番目の値を入れ替え、次にi+1とi+2を2で割り、…最後にn-1とnを2で割り、条件に一致すれば値を入れ替える。次は3,4でまた同じように割っていき、…、最後にmで割り、一連の動作をして、終了」といった、少し面倒な処理です。自分でも書いててわからなくなってきました。
しかし、またもや面倒な処理がありますね。また入れ替えないといけないんですね。しかもsortなんて使えるようなもんじゃありません。

じゃあどうすればよいのでしょう?簡単な話です。
swap関数を使えばいいのです。なにも<algorithm>はsortしかできないわけじゃないのですから。
swap関数の使い方はいたって簡単です。
swap(入れ替えたい値が入った変数名,入れ替えたい値が入った変数名2);
これだけです。たった一行です。ね、簡単でしょう?

ちなみに配列の宣言には<vector>を使って要素数を自由に変更できるようにしました。おそらく、vectorを使わなくても大丈夫とは思いますが、念には念を、ということで。

ちなみに三問目ですが、そもそもどういった計算をすればよかったのかすらわからず撃沈しました。すみません。

今回はSTLについて書きたいことを書きましたが、まだ5%も使いこなせているか危ういです。そのため、間違った情報を書いている可能性があります。ご了承ください。

次回の15日目はアルセニー先輩です。よろしくお願いします。


コメントを残す

メールアドレスが公開されることはありません。