はじめに
こんにちは。最近サークル活動に参加できていないCaffeineholicがお送りします。 最近個人ブログを書き始めたり、バイトで顧客に向けた文章を書く必要が出てきたりと、文章を書く力の必要性を感じています。 今回は5完できましたがそこまで難しい問題ではなかったようで、想定よりパフォーマンスが出なかったという印象でした。 所感と考察を簡単に書いていこうと思います。
結果サマリ
-
WCPC参加人数: 5人
-
各問題の最速解答者(ペナルティ無し):
| 問題 | 参加者名 | タイム | 言語 |
|---|---|---|---|
| A | Caffeineholic | 1:01 | Python |
| B | nsubaru | 2:46 | Java |
| C | nsubaru | 5:45 | Java |
| D | nsubaru | 38:22 | Java |
| E | nsubaru | 18:02 | Java |
| F | - | - | - |
| G | - | - | - |
今週の出題
A問題
問題文を表示
問題文
英小文字からなる文字列 が与えられます。
以下のようにして決まる文字列 を出力してください。
- の末尾の文字が
eである場合、 は の末尾にrを付け加えた文字列である。 - の末尾の文字が
eでない場合、 は の末尾にerを付け加えた文字列である。
制約
- は英小文字からなる文字列
- の長さは 以上 以下
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
if文と文字列操作の復習です。問題文の指示に従ってコードを書ければ、ACできる問題だったと思います。
B問題
問題文を表示
問題文
は英小文字からなる長さ の文字列です。
は英小文字および * からなる長さ の文字列です。
が にマッチするとは、 に含まれる * をそれぞれ好きな英小文字で置き換えることで を に一致させられることをいいます。
が にマッチするかどうかを判定してください。
制約
- は英小文字からなる長さ の文字列
- は英小文字および
*からなる長さ の文字列
入力
入力は以下の形式で標準入力から与えられる。
出力
が にマッチするならば Yes を、マッチしないならば No を 行で出力せよ。
,の長さが異なる場合は置き換えという操作をいくら行っても一致させることができないので No を出力し、それ以外の場合について考えます。
と の各文字について、異なっているかどうか、 が * であるかどうかを見ていきます。
異なっており、かつ が * ではなければ、その時点で No を出力し、No を最後まで出力しなければ Yes を出力することで正解できます。
C問題
問題文を表示
問題文
以上の整数 と長さ の正整数列 が与えられます。
それぞれに対し以下の問題を解いてください:
を降順に並べたとき、前から 番目にくる値を求めてください。
制約
- 入力される値は全て整数
入力
入力は以下の形式で標準入力から与えられる。
出力
行出力せよ。
行目 には とした時の答えを出力せよ。
優先度付きキューを利用するのが最も簡単な解法だと思います。優先度付きキューを一つ用意し、最初の3文字を格納しておきます。 について、
- 番目の値を優先度付きキューに格納する
- 優先度付きキューから3個値を取り出す。
- 3回目に取り出した値だけを出力して、またすべて格納しなおす
という作業を繰り返すだけで解けます。わからなかった方は、各言語での優先度付きキューの使い方と仕様を調べておきましょう。
D問題
問題文を表示
問題文
AtCoder 王国では、 ドル紙幣と ドル紙幣の 種類の紙幣が流通しています。
AtCoder 王国にある J 社の全自動食堂では、デザートやドリンクが商品として売られています。
J 社の全自動食堂には、 個のデザートを売るデザート販売機と、 個のドリンクを売るドリンク販売機があります。 デザートには から までの、ドリンクには から までの番号が付けられています。
デザート の価格は ドル、ドリンク の価格は ドルです。
支払いに使う紙幣として、デザート販売機は ドル紙幣と ドル紙幣の両方を受け入れますが、ドリンク販売機は ドル紙幣しか受け入れません。 どちらの販売機も、お釣りはすべて ドル紙幣のみを使って返します。 同じ商品を 個以上買うことはできません。
高橋君は ドル紙幣 枚と ドル紙幣 枚を持って J 社の全自動食堂にやってきました。
高橋君が手持ちの紙幣で買える商品の組合せにおいて、購入できる商品数の最大値を求めてください。
制約
- 入力される値はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
今回解けた問題の中で最も難しいと感じました。高いレートを獲得したければ、こういう問題に時間をかけてはいけない気がします。 ドリンクを先に買うことができればそのあとはシンプルに、kドル札を1ドル札k枚としてデザートを何個買えるかを求められそうです。 したがって、ドリンクを買う数を全探索して、そのそれぞれについてデザートを何個買えるかを二分探索で高速に求めました。 前処理として累積和を用意しておかなければいけない点や問題文に使われている単語が多くて情報の処理が追いつかないといった点から、かなり時間を取られてしまいました。 順位表からも、ある程度の人は私と同じようにA->B->C->Eを先に解いてからD問題に取り掛かったことが読み取れます。
E問題
問題文を表示
問題文
の順列 と長さ の整数列 , が与えられます。
この順列 に対し、 の順に以下の操作を行います:
のうち、最小の値をもつ要素と最大の値をもつ要素の位置を入れ替える。
回の操作が終わった後の の各要素を求めてください。
制約
- は の順列
- 入力される値は全て整数
入力
入力は以下の形式で標準入力から与えられる。
出力
回の操作が終わった後の の各要素を先頭から順に空白区切りで出力せよ。
ある区間の最大値や最小値を高速に求める必要がある、要素を更新する必要がある、ということからセグメント木を連想しました。このデータ構造を利用すればこの問題の「更新されるべき要素の値」が分かります。 それが分かれば、各要素の値とインデックスを紐づけておいてそれも同時に更新していけば解けることが分かります。 D問題よりも複雑でない、データ構造の知識があれば解ける問題でした。逆に落とさなくてよかったと思っています。
F問題以降は割愛とさせていただきます。
最後に
以上、Caffeineholicでした。代表にもそろそろ執筆を手伝ってほしいものです。またお会いしましょう。