M-SOLUTIONS プロコンオープン 2020

参加しました。

とりあえず四完でしたが、もうちょっと頑張りたかったです。

 

Tasks - M-SOLUTIONS Programming Contest 2020

All Submissions - M-SOLUTIONS Programming Contest 2020

 

A-Kyu in AtCoder

200点ごとに級が分かれているので、for文で繰り返し200を引いていくことで出力を得ました(1回引いて400点未満になれば8級、2回なら7級、3...)。繰り返し引くということは割り算そのものなので、なぜわざわざfor文を使ったのかコードを書き終えてから疑問に思いました。

 

B-Magic 2

真に大きいという言い回しはAtCoderではあまり見ないように感じましたが、サンプル2から、(ある数)より大きいという意味(その数を含まない)で解釈しました(4を一度2倍して8、2を二度2倍して8で、合計3回の操作になるが、これは成功ではないとなっている)。

シンプルにBがAより大きくなるまで2倍し、その操作後のBよりもCが大きくなるまで2倍して、操作回数を数えました。操作回数をKを比較して出力を得ることができます。

Aに操作を行うと、BとCの必要操作回数が増える可能性はあっても減る可能性はありませんし、Bも同様にAを越すギリギリの回数よりも多く操作を行っても、Cの必要操作回数が増える可能性が生まれるだけになります。

 

C-Marks

評点は直近K回の期末テストの点数を掛け合わせたものになるので、ある学期の評点とその一つ前の学期の評点は、決定するために勘案する点数の大半が重複しています。重複していない部分は二か所だけで、ある学期の期末テストの点数と、一つ前の学期の評点に勘案される一番最初の期末テストの点数だけです。ある学期の期末テストの点数は当然一つ前の学期の評点には影響せず、一つ前の学期の評点に勘案される一番最初の期末テストの点数は、ある学期の評点には影響しません。

以上のことから、K+1学期から順にi-k学期の期末テストとi学期の期末テストの点数を比較していきました。

 

A-Road toMillionaire

方針はすぐに固まったものの、コードの間違えている部分を修正するのに時間がかかって勿体なかった問題です。

安い時に買って、高い時に売ると儲かるというふんわりしたセオリーはなんとなくわかります。買い時と売り時を同時に考えるとややこしいので、初期の状態から考えることにします。まず、株を持っておらず所持金が1000円のところからスタートになります。ですので、どういうときに株を買えばいいのかから検討しました。基本的に1日目に株を買ってはいけない状況というのは、2日目の株価が下がっている時です。1日目は何もしないで、2日目に株を買う方が安くたくさん買えるからです。逆に、2日目に株価が上がっていれば1日目に買っておくべきです。2日目に売ることで確実に利益になるからです。買い時については、2日目以降も同様に考えることができます。翌日の株価が今日よりも安くなっているのであれば買うことは控えます。

買い時については決定しました。次は売り時について考えます。基本的には買い時ではない時に売るべきです。つまり、翌日の株価が下がっている時です。この場合は今日すべて売ってしまうことで、翌日により多くの株を買うことができます。

また、株を売るときや買うときは持っている株やお金をすべて使うべきです。一番安い時に買っているので、所持金があるのに買い控えると次に売るときの金額が少なくなりますし、逆に売るときに株を残しておいても次に買うときの資金が少なくなるからです。

持っているお金や株を、取引をする場合は都度すべて使うように気を付けて、前述の基本方針に則って取引をした場合、株を買うお金がないのに株を買うべき日や、株がないのに売るべき日があります。しかし、このような場合は前日までにより株価の安い日に株を買い切っていたり、より株価の高い日に株を売り切っているということになります。なので、これらの状況は無視していいことになります。

コンテスト中は買い時と売り時をチェックして配列にメモしていき、その後前から順に買い時と売り時にそれぞれ操作して出力を得ていました。今考えると、あらかじめ買い時と売り時をチェックしておく必要は特になさそうです。

コンテスト中に時間がかかったのは、買い時と売り時をメモしていく際に買値の更新を間違えていることに気が付かなかったからです。特に必要のない手間を増やして、さらにそこでバグらせていたのでかなり嫌な気持ちになりました。

 

今回は以上です。EとFはかなり厳しいですね…。