PCK2017本選 参加記

PCK本選お疲れ様でした。

結果は、6AC5WAで上位入賞はできませんでした。
しかし、普段はtwitterでしか交流できない競技プログラマーの方と直接お話することができてとてもうれしかったです。

本選中にであった競技プログラマーの皆様。
https://twitter.com/kotatsugame_t/lists/pck2017/members

TLのトップ画が美少女でも、現実が美少女とは限らない

 という衝撃の事実に始まり。友利奈緒のかわいさ、るましのかばんは友利奈緒、実は例のカモノハシハが筆箱だった、こたつがめ氏がShell芸始めるらしい、大富豪は地方ルールがすごい、Platypus氏太鼓の達人がすごく上手い、会津大生滅茶苦茶やさしい(お客様扱いなのでそれはそう)、今年のテレビちゃんはMサイズだった、テレビちゃんはWA投げで3/6でゲットだった、会津購買は3種の神器がそろってる、TLE購買で買ってしまった。などなどとても充実した2日間でした。


 反省として大分はしゃいで自分を見失っていた感じがありました。
 

f:id:nasatame:20171107220849j:plain
ウクーニャさんとツーショットちなみに写真撮影者はbeetさんです。

ずいぶん駆け足になってしまいましたが参加記の方を閉めさせていただきます。
PCK本選で出会った全ての皆様本当にありがとうございました。あの2日間は忘れられないすばらしい時間でした。

しないわけにもいけないので駆け足で問題の解説をします。(実際の解説もかなり駆け足でした。)

1問目

 やるだけ。for,ifがあればなんとかなる。

2問目

 やるだけ。誤差が出ないように気をつける、分かりやすい変数名、double型を使わない。などがあれば特別賞を狙えたらしい。

3問目

 二人の誕生年月日から。二人の年の差の最大を求める問題。うるう年についての解説があるが結局無視して大丈夫だった。if文

4問目

 与えられた数の中から、最大の数を見つける。
 その数の公約数を列挙して、lower_boundする。
 結果を加算して解答。

5問目

 1日3回ご飯を出せる。ご飯を出す時刻を好きに決められる。
 N人のお客さんのそれぞれ朝ごはん、昼ごはん、夜ごはんを受け取れる時間が与えられる。
 3食食べられる、お客さんを最大化しなさい。
 お客さんのご飯を食べ始める時間にだけご飯を出すか試せばいいため、
 N <= 50 から 50*3 = 150 これを3回ご飯を出すため。
 (150 ^ 3) = 約3*10^7となる。
 前処理で、ご飯ごとにそれぞれ24*60=1440でlong long intの配列を作っておき食べれる人のorをとっておけば、andを使うことでO(1)で何人が3食すべて受け取れるか判定できる。
 この解法は、O(3*10^7*32)のため余裕で間に合う。

6問目

 与えられた2次元配列の行と行、列と列を入れ替える処理を行い市松模様を作れるかこたえよ。 
 正直、テストケース作りまくって力技で通したため考察はしていない。
 しかし、解説を聞いた限りだと存在する1の数が決まっている。2種類の列と行しか存在しない。などを使えば簡単に実装できるらしい。

7問目

 正直6問目と同じく運だけで解いた感がある。
 答えが8以下になる。
 3桁以上に分割する場合場合同じ桁数で分割するしか答えが8以下になるパターンは存在しない。など使えばいいらしい。
 2桁以下はDPでがんばる。


 総評、なぜ6ACできたのか謎。気づきがあった。(その割に次の日のARCで2問目をとけずレートを19も溶かした)(行きの仙台売店でCCさくら買ったのが良かったのかもしれない)

pck2017予選個人的感想

PCKお疲れ様でした。

まず結果から、7完3WA。
多分、地域1位なので本選はいけそうとか甘えた考えを持っています。
3つぐらい反省しなきゃいけないところはあったんですが、自分なりの全力は出せたと思います。

反省

紙ライブラリの製作に手間取り学校到着が予選開始15分前になってしまったのが全ての始まりでした。

学校到着時だれもパスワードを把握しておらず、急遽事務局に問い合わせをしました。
すぐさま、担当の先生に対応していただき無事に予選をほぼ時間通り開始できました。


開始後すぐ後輩に投げて1から3問目を埋めてもらいました。
これは、後々考えると凄いいい選択でした。

開始、30分ほどで埋めてくれたのですが私はその間に6問目までの考察を終わらせることが出来ました。

そこから、4問目始点と終点でバグらせて手元でWA。
4、5問目をとき終えたころには開始から1時間たっていました。

そこから、6問目解いたのですがパンケーキの悪夢再び。

実装ミスで2WA。
1WA目は、ぴったり飛ばなきゃいけないものだと思い込んでいた。
2WAは、「現在飛べる距離+現在の位置のトランポリンの飛距離」にしていたのを「現在の位置+現在の位置のトランポリンの飛距離」にしなきゃいけないという凡ミスをやらかしました。

なんとか、30分かけてバグ取り。これにこんなに時間かけたのは一つ目の反省点。

7問目、見てすぐに2列分だけ状態を持ったDPだと分かり解けそうだと飛びつく。これが二つ目の反省点です。

まあ、かなりバグらせながら1時間かけてAC。途中集中力を失いメモ化するのを忘れて提出それによりいらない1WA。
これが3つ目の反省点。

そこから、残り20分になり8問目ぱっとみ解けそうにないのであきらめ。
順意表をながめおやつをたべながら雑談。
7AC3WAに甘んじました。

予選終了後

8いけたじゃんと気づき死にそうな気分に。
https://paiza.io/projects/WI9kkifTHiJPqzvPhZkY5Q

今後の改善点

1・ちゃんと問題文読め。きちんと例外ケースを考えろ。今回気づけたのは奇跡。次はないと思え。
2・解けそうな問題に飛びつくな。ちゃんと問題文一通り見ろ。
3・これ結果にかかわる、でかい!!集中力を失った結果いらない1WA。
番外・パスワード誰も知らないのは笑った。すぐさま対応してくれた事務局ありがとう。

おわりに

 休日出勤して監督くれた先生ありがとうございます。もう、3年目になりますね。私と先輩で始めた試みですが、芽は順調に育ち今後も後輩が続けてくれると思います。ぜひ、非情報系学校が、どこまでいけるか見届けてください。
 パスワードを忘れるという大ポカに対して、すぐさま対応してくれた事務局ありがとうございます。無事遅れることなく参加できました。
 一緒にでてくれた後輩、君がいなかったらそもそも出場できませんでした。しかも、今日のために1日1ACするとか言う苦行までして準備してくれてありがとう。いつも謙遜しているけど、確実に力になっていることは私が保障するのでこのまま頑張ればなんでも出来る。頑張れ。
 最後に、去年、一昨年一緒に出場してくれた先輩ありがとう。今でもいつでもお世話になってます。少しは、迷惑かけないようになろうと頑張ってますからもう少し待ってください。

 本当に最後に私にtwitterでかまってくださる皆さん本当にありがとうございます。私がここまでプログラミングできるようになったのは皆さんのおかげです。もし、本選で結果を残せたらあいつは俺が育てたとか言ってください。まだ、本選いけるかも分かりませんが本選でも全力を尽くします。

次は、高専プロコンです。
高専プロコンまで残り1ヶ月。

進捗やばいですが、

人力GUI誠心誠意製作中です。
人力勢、人力PC勢の本気を見せてやる。今年は、パズコンにはさせないからな!!!待ってろ。

AGC011個人的な反省

遅刻

理由は、これ


f:id:nasatame:20170313144309j:plain


これのせいで20分ほど遅刻して参加しました。

2問解けました。
今回のセットはレート1600位までは、2問早解きででそうだったのでとても残念です。

解説?

A問題

時間Tiに N 人の乗客が到着します.
乗客を待たせる時間をK以下にして、バスの定員がCのとき。
何台バスを出発させる必要がありますか?

という問題でした。

考察としては、バスの出発時間を最大限遅らせるためにはT[i] + Kにバスが出ることにすればいい、ということだけでした。
よって貪欲で解けました。

到着時間をソートした後。(入力はソートされていない)

  • バスには現在何人乗っている。
  • バスは何時に出る。
  • バスは何台出た。

という三つをもって貪欲しました。
新しいバスが必要になる条件は、定員オーバーと前のバスが出たという二つになります。
境界条件が分かりづらいので注意。
Submission #1157617 - AtCoder Grand Contest 011 | AtCoder

B問題

N匹生き物がいて、自分の体の2倍以下まで食べられます(食べた分だけ大きくなる)。最後まで残ることができるのはどのサイズの生き物まででしょうか?

という問題でした。

考察は、自分より小さい生き物は全員食べられる。
自分より小さい生き物を全員食べた上で食べられない生き物がいればそいつ以下の生き物は生き残ることができない。

つまり、生き物の大きさをすべて足していってその2倍よりも大きい生き物がいたらそこを記録するということをするだけです。

これも入力をソートする必要があります。

例3
40 1 30 2 7 20
ソート
1 2 7 20 30 40
足していくと
1 3 10 30 60 100
大きさ3の生き物は7の生き物をたべられないので、そこを記録します。
よってこれは、それよりも大きな4匹の生き物が残れるので答えは4になります。

Submission #1157909 - AtCoder Grand Contest 011 | AtCoder

プログラミング言語Kemonoをより書きやすく。

最近Twitterで、プログラミング言語フレンズ Kemonoという言語があるのを知った。
しかし、Brain f*ckよりタイプ数が多いため自然書きづらくなっている、どうしようか。
ということで書いてみた。

//Form Brain f*ck to Kemono
#include <iostream>
#include <string>
#include <map>
using namespace std;


int main(void){
    
    map<char,string> m;
    
    m['>'] = "たのしー!";
    m['+'] = "たーのしー!";
    m['<'] = "すごーい!";
    m['-'] = "すっごーい!";
    m['['] = "うわー!";
    m[']'] = "わーい! ";
    m['.'] = "なにこれなにこれ!";
    m[','] = "おもしろーい!";
    
    string s;
    cin >> s;
    
    for(int i = 0; i < s.size(); i++) cout << m[s[i]];
    cout << endl;
}

言うまでもないですが、BrainfuckからKemonoに変換するためのプログラムです。

作業時間3分。これを使うと、、、

+++++++++[>+++++++++++<-]>--.+.+.
たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!うわー!たのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!たーのしー!すごーい!すっごーい!わーい! たのしー!すっごーい!すっごーい!なにこれなにこれ!たーのしー!なにこれなにこれ!たーのしー!なにこれなにこれ!

こうなります。
KemonoはBrain f*ckと同じく、チューリング完全な言語ですから愛があればきっと無限の可能性があるはずです。
最後までありがとうございました。
(アニメ見ないとな。)

ABC037-D問題による過去との実力比較

今年ももうすぐ終わります。今年一年楽しかった思い出(PCK)も忘れたい思い出(procon,JOI)もいろいろできました。1年を通してとても競プロ的に充実していたと思います。

ということで、自分の競技プログラミング力が今年1年でどの程度上昇したのか確認してみることにしました。

f:id:nasatame:20161228215159j:plain

まだ薄青というとても誇れたものではないレートですが、確実に今年の7月からみると上昇しています。

次にコードによる比較を行ってみることにしました。
これは5月27日に解いた。
abc037.contest.atcoder.jp
のコードです。


改めてみるとメモ化再帰しているのは分かりますが、正直なにやってるのかわからないぐらいひどいコードです。メモリも93MBも消費しています。

これは12月28日(今)解いてみたD問題のコードです。かなりスマート(解法どおり)なコードです。メモリ消費は16MBほどです、なんと1/5ほどになりました。実行時間も797msから576msと200msほども短くなっています。あんまり差がないきがしますね。

最近はAtCoder以外にもCodeForcesなどに参加するようになりましたがぜんぜん駄目です。今年はいろいろ失敗することが多い年でした。でもそれはいろいろ挑戦するようになったから失敗も多くしてしまったのだと思います。これからも成長を止めないように頑張っていこうと思います。

来年は、AtCoderで青くできたら黄色くなりたいです。最後に、おそらさん、yumechiさん今年一年本当にありがとう。いろんなところでお世話になりました。大好きです。この場を借りて述べさせていただきます。

駄文を最後までお読みいただきありがとうございます。

JOI2016/2017予選参加記 JOI予選落ちた勢の戯言

 

2016年12月11日に行われたJOI2016/2017予選に参加しました。
 
結果は、残念なことに240点で本選に出場することができませんでした。
予選敗退の理由は、提出ミスです。
負け惜しみのようですが、解答ファイルの提出順序を間違ったり。
コマンドプロンプトで実行した結果をテキストファイルにコピーする過程で改行コードを抜かしたりなど、つまらないミスで160点ほど落としてしまいました。
一応、結果はあっていたので(フォーマットを除く)とても悔しいかったです。(それも含めて実力なんだが、、、)
 
さて、このようなミスで点数を落とさないためにはどうしたらいいのか考えてみました。
 
そのなかで改行などフォーマットのミスを減らすために考えたのはバッチファイルを利用することです。
 
あるディレクトリがあるとします。その中に、
・実行ファイル.exe(例ではjoi.exeとする)
・入力ファイル.txt(例ではin.txtとする)
があるとこんなコマンドを使用することが出来ます。
 
コマンドプロンプトを立ち上げて。そのディレクトリに移動して。
type in.txt | joi.exe >> out.txt
と打つと。
in.txtの中身がjoi.exeに入力されてその結果がout.txtに出力されます。
 
それを踏まえてこのようなbatファイルを作ってみました。
 

 

実行結果です。f:id:nasatame:20161216222107p:plain

 
使い方は、最初にexeファイルをコマンドプロンプトにドロップして、その後にスペース区切りで入力ファイルをドロップするだけです。このようにします
joib.bat joi.exe in.txt in.txt in.txt in.txt in.txt
少しバッチファイルに手を加えればバッチファイル実行後随時入力ファイルをドロップするように出来たりいろいろできます。
 
二つ目に考えたのが、1,2,3,4,5とファイルを提出するところで5,4,3,2,1などと提出するようなミスを減らす方法ですが。
これは考えてもどうしようも出来ませんでした。
あえてあげるなら一度全部提出した後ダウンロードしてみて確認するぐらい。
まあそんなミスするやつはいないでしょう()。
 
今回見事予選落ちという結果になったJOIですが、考えてみれば前からほしかった基本情報技術者などの資格にチャレンジするための時間が手に入ったと考えればそれほど悪くはなかったです。
 
このような戯言、JOI予選で落ちた腹いせに書いた文章に最後までお付き合いいただき本当にありがとうございます。
(実はみんなやってるテクだったりしたら悲しいです、あと参加記とか書いててまったく予選問題の解説しないでごめんなさい)