【86/BRZ・BMW G20 330i】20代前半関東在住の筆者が自家用車を持つにはどのぐらいお金がかかるか計算した
小さい頃から車が好きで、自分の車を持つのは昔からの夢だった。 自分が車の免許を取ったのは大学1年生の冬で、社会人1年目の執筆日時点でもう6年ほど経つのだが、大学・大学院在籍中に車を維持するのは金銭的にも中々難しく(若年層の保険料は高いし、大学・大学院時代に暮らしていた名古屋市内は駐車場が高いし・・・、バイトで収入を増やすにしても、今話題の103万の壁の都合で限度があるし・・・)、幾度も検討しては断念するという日々を送っていた。今年度から社会人になり、学生時代とは状況が色々変わってきたので、現在自分を取り巻く環境だとどのぐらいお金がかかるのか、改めて計算してみる。
なお今回は、タイトルにも書いてある 86 (ZN8) / BRZ (ZD8) とBMW 330i (G20) を対象として計算している。 (車が欲しいとは言っても、あくまで自分は走りの良い車が欲しいのであって、一般的なお買い物車が欲しい訳ではない)
BMW3シリーズは320iや320dあたりがメインストリームだと思うが、330iと維持費の点で極端に大きなズレはないと思われる。86/BRZとBMW3シリーズ検討中の人の参考になれば幸い。


試算の前提条件
車の維持費は人によって大きく異なる。例えば任意保険の金額は契約条件や契約者の年齢で大きく変わるし、駐車場代は住む場所によって大きく変わる。 タイトルに「20代前半関東在住の筆者が」とあえて書いているのは、このような事情があるためだ。そして、「若者」「関東在住」という属性は、事故率と駐車場の土地が高いので維持費が高くなりがちである。
今回の試算では以下の条件を想定しているので、必要な部分は適宜読者の条件で計算しなおすことをおすすめする。
- 居住地
- 神奈川県(横浜駅まで電車一本でいける立地)
- 駐車場は自宅近辺の月極を契約する
- 年齢
- 24歳
- 任意保険契約条件は以下の通り
- 本人限定
- 6等級
- 車両保険はエコノミー型(= 自損事故は保障の対象外)
- ゴールド免許割あり
- 特約は弁護士特約 (86/BRZだけ新車特約付きで計算)
- 私が所属する会社の団体割を適用
自分の場合、維持費で最低4〜5万/月
維持費の詳細は以下表の通りだった。
86 / BRZ
- 月額:45,042円
- 年額:540,500円
| 項目 | 単価 [円] | 月数 | 月単価 [円] | 全体比 [%] |
|---|---|---|---|---|
| 任意保険 | 97,000 | 12 | 8,083 | 18.0% |
| 自動車税 | 43,500 | 12 | 3,625 | 8.1% |
| 車検(税金等込) | 120,000 | 24 | 3,333 | 7.4% |
| 燃料代 | 10,000 | 1 | 10,000 | 22.2% |
| 駐車場代 | 20,000 | 1 | 20,000 | 44.4% |
- 月額:49,667円
- 年額:596,000円
| 項目 | 単価 [円] | 月数 | 月単価 [円] | 全体比 [%] |
|---|---|---|---|---|
| 任意保険 | 125,000 | 12 | 10,417 | 21.0% |
| 自動車税 | 36,000 | 12 | 3,000 | 6.0% |
| 車検(税金等込) | 150,000? | 24 | 6,250 | 12.6% |
| 燃料代 | 10,000 | 1 | 10,000 | 20.1% |
| 駐車場代 | 20,000 | 1 | 20,000 | 40.27% |
特定のタイミングで一括で支払う保険料や各種税金を月額単位で均して計算すると、最低でも月額4〜5万はかかる計算になった。 不定期で発生する車両の修理代(特にBMWはこれが怖い)、オイル交換や洗車など日常的に発生するメンテの代金など、別途必要になる支出も想定されるため、実際にはこれ以上かかるはず。 なお、330i の項目で車検に?がついているのは、外車は車体のコンディションによって金額が大きく変動するのが予想されるため。外車は修理代が本当に怖い。
以下、表中の各項目について、順番に見ていく。
任意保険
流石に自賠責オンリーで乗り回すわけにはいかないので、必須費用。大体どちらも年間で10万円前後かかる計算で、維持費全体の20%を占めている。 様々な割引(本人限定・ゴールド免許割・車両保険エコノミー・団体割適用)を駆使しているが、それでもなおこの値段とは、若者の任意保険は本当に高い・・・。 しかも私は新規で契約するので6等級スタートになっており、なおさら高い。実家の等級が引き継げれば嬉しいのだが・・・。
ちなみに、330iは86/BRZよりも3万弱高い見積もり額になっているが、これは外車の車両保険が全般的に高いのが要因。 しかし3シリーズはまだマシな方で、もう少しセグメントが上の5シリーズなんて車両保険料率が最大の17になっており、ダイレクト型のような安い保険会社だとそもそも引き受けてもらえない。 外車オソロシヤ・・・。
自動車税
車の排気量に応じてかかる税金。86/BRZは4.35万円、330iは3.6万円。 86/BRZは現行モデルから排気量が400cc増えて2.4Lになったため、2Lの330iと比較して7500円ほど高くなっている。 割合としては全体の6〜8%で、こうやってみると意外と大したことないようにみえる。(もちろん取られないで済むなら取られたくないが!)
これについては工夫で安くなったりするものでもないので、特に言う事はない。
車検
ディーラー車検の事例をいくつか調べた結果、どちらも10万円台と仮で見積もった。 単価は高いが、車検は2年おき(新車なら初回は3年)の実施なので、月額換算すれば維持費全体の1桁%代後半から10%前半程度で落ち着く。
車検についてはオーナー次第で値段が大きく変わると思われる。 ユーザー車検で最低限通すだけならもっと安くなるだろうし、ディーラー車検で気になるところ全部直すならもっと高くなるだろう。 先述のように、今回の見積もりはディーラー車検の事例をいくつか調べた結果を元に出した金額なので、もっと安くしようと思えば多分できるはず。 ただ、現行の86/BRZは最後のピュアエンジンスポーツカーになる可能性が高く、リセールも期待できるので、大事にメンテして乗ったほうが後々嬉しいかも?とは思います。
なお、330iについては、ディーラーで車検してもある程度常識的な価格で収まるのが意外でした。 まぁただ、なにか壊れた途端に数十万吹っ飛ぶので、正直金額は未知数・・・。
燃料代
あまり頻繁に長距離出かけるつもりもなく、通勤も電車なので、ひとまず月500km程度の走行を想定してどちらも1万円に設定。 燃費は86/BRZと330iどちらも10km/L(WLTCモード)程度で、どちらもハイオク(180円/Lぐらい?)。
車の性質上燃費が悪いのは仕方ないとして、ガソリンってこんな高かったっけ・・・。 リッター30km出るプリウスが爆売れする理由が分かる。
駐車場代
徒歩数分圏内の大通り沿いにある月極駐車場(平面駐車場・青空駐車)4〜5件に問い合わせた結果、相場は大体月額2万円だった。最安値は1.5万円だったがそこは満車で、すぐには借りられないとのこと。 駐車場代の負担はかなり大きく、維持費全体の40〜45%を占める。ここをいかに削るかがポイントになりそう。
関東は本当に不動産系が高く、車を持つには厳しい環境。こればかりは関東在住者の宿命ではある。実家がある関西の田舎なら月額数千円で駐車場貸してくれるのに・・・。 これまでに自分が問い合わせたのは利便性の良い大通り沿いの物件だけだったため、利便性が多少犠牲にはなるが安い駐車場はないか今後調査する予定。
車両本体のローンも合わせると10万/月?
ここまでで述べた維持費だけでも月額最低4〜5万円かかることが分かったが、忘れてはならないのは車両本体価格。 一括で買える財力がある人はいいが、私は執筆時点で社会人1年目なので、まとまったお金がない。 というわけで、近いうちに車を買うなら必然的にローンを組むことになるため、このローンも含めた額を計算してみる。
300万借入5年ローンで、月額5万円の返済額が上乗せ
個人的に、86/BRZを買うなら新車か新古車、3シリーズは中古を想定している。
86/BRZは将来的なリセールが期待できるため、できるだけ状態のいい個体を買って高く売却したい。 一方、3シリーズはリセール最悪だし、そもそもBMWの新車は自分にとって高すぎる(狙っている330iはすでにカタログ落ちしており、そもそも新車では買えない)ので、新車は検討外。 ただ、リセールが悪い分中古車は値崩れしておりお買い得で、比較的程度の良いディーラー認定中古車を狙う予定。
本体のお値段だが、86/BRZの新車価格と2019年式2〜3万kmの330i認定中古車が同じぐらいの価格で、およそ350万円+諸経費。 ただ、86/BRZの場合、ナビやETCなどのオプション代を考慮する必要があり、オプションを最低限にしつつナビなどを後から自分でつけて費用削減するにしても400万コースになりそう。 一方330iは、個体次第で総額350万程度でも買える。 トータルで考えると、330iの方が大体50〜100万ぐらい安く買える。
例えば、300万円を5年(60ヶ月)ローンで借り、残額は貯金で支払うとすると、金利を除いて月5万円の支払いが発生する。 しかし当然金利の考慮は必要で、例えば金利3.9%のスバルクレジットなら約32万円(約5300円/月)、銀行ローン(色々な商品があるがひとまず金利2.5%とする)なら約20万円(約3300円/月)が利息として上乗せされる。 これらすべて合計し、維持費と足し合わせると、見出しにもある通り月額10万円程度の支出が発生する。
・・・。た、高い・・・。
なかなか厳しいが、夢は叶えたい
自分が欲しい車を買うには、月額10万円、年額にして120万円は必要なことが分かった。なかなか勇気がいる金額だ・・・。 (社会人1年目風情がそんな高い買い物すんじゃないと怒られそうですが、検討するだけならタダですし、私の夢なので許してくださいw)
んー、どうでしょう。86/BRZはリセールが良いので売却時にまとまった額が返ってきそうなのでまだ良いが、330iは購入時300万超えでも売却時には2桁万円になっている可能性が高い。 売却のことまで考慮するなら86/BRZか・・・。MT乗ってみたいし。ただ、正直86/BRZの内外装そんなに好きじゃないのと、BMWの乗り味を一回体験したいという気持ちもあり。 自分の好みを優先するなら、総合的に330iかなぁ。 うーん、悩ましい・・・。
もうしばらく検討が続きそうです。
3泊4日香港訪問記 #2 香港島観光(益昌大廈・イオン・ヴィクトリアピーク100万ドルの夜景・夕飯)
概要
香港政府主導の航空券無料配布キャンペーンを利用して香港にやってきた時の記録。パート2になります。
前回の記事はこちら。
香港島観光
3泊4日とタイトルにあるとはいえ、1日目の夜に香港着、4日目の午前に香港発の行程だったので、のんびり観光する余裕はあまりありませんでした。そのため、1日で香港島をザーっと回ることにしました。100万ドルの夜景で有名なヴィクトリア・ピーク(島の西部)に夕方から夜にかけて居られるようにしたかったので、午前中の内に島の東部へ一気に移動し、夕方になるのに合わせてゆっくり西側へ戻ってくるようにしました。

香港島の中心地は島の北部にあり、そこを東西に地下鉄とトラムが走っています。トラムの方が安いのですが地下鉄の方が速いので、さっさと移動するために今回は地下鉄を選択。
香港の地下鉄に限らずですが、海外の鉄道の椅子って金属製であることが多いですよね。日本はソファみたいな感じの布製ですが。 金属製の方が汚れた時とかのメンテナンス性は良さそうです。金属製は座面が硬いので、私は日本式が好みです。 その他に気づいたこととしては、日本の鉄道と比べて通路が広かったです。後から調べてみたところ、香港の地下鉄と日本の新幹線はほぼ同じレール幅を持つらしいです(所謂1435mmの標準軌)。広いのも納得です。ちなみに、一般的な日本の在来線はこれらより400mmほど狭い幅のレールを採用しているとか。

この旅行では結構地下鉄のお世話になったのですが、地下鉄構内のいたるところにちびまる子ちゃんのポスターが貼ってありました。 これも後から調べて分かったことですが、香港ではちびまる子ちゃんが大人気らしいです。漢字では「櫻桃小丸子」と書くみたいです。そのまんまです。日本では子供が見る国民的アニメという位置づけのちびまる子ちゃんですが、香港では大人からも人気を博している様子。実際にちびまる子ちゃんの刺繍が入ったタオルを持っている大人を地下鉄で観測しました。


地下鉄に十数分揺られ、香港島の東側へ到着します。正確な料金は忘れましたが、今回乗った中で一番高かった地下鉄料金が大体200JPY台前半ぐらいだったと思います。近距離なら100JPY台なので優秀です。
まず来たのがモンスターマンション(益昌大廈)と呼ばれる有名な高層住宅街。 1972年に完成し、2200戸がここに集結しているらしい。香港の特徴である超過密っぷりを象徴する、他国ではお目にかかれない光景を見られます。 その異様な光景からハリウッドのロケ地にもなったらしいです。(映画には疎いのでよく知りませんでした。)
ハリウッドのロケ地にもなると流石に注目度が高まったようで、写真をバシャバシャ撮ってる先客が何人もいました。一応現役で稼働している住宅街なのですが、住民は自分の住処が観光地化されてどういう心情なのでしょうかね・・・、とちょっと心配になりました。とはいえ、自分も観光客として訪れている身なので、何も言えません。調べたところ、昔一度近隣住民とのトラブルがあり、一騒ぎあったようです。今は落ち着いているようですが、節度を守る必要はありますね。写真を撮り忘れましたが、ドローン禁止のでっかい張り紙が入り口にしてありました。かつてドローンで空撮した観光客がいて問題になったんでしょうか。圧巻の光景なので、やりたくなるのはめちゃくちゃ分かりますがねw ささっと写真を撮って退却しました。

そのまま次の目的地へ移動しようと思っていたのですが、移動中に日本ではお馴染みのイオンモールが目に飛び込んできてしまい、ちょっと寄り道しました。(外観の写真を撮り忘れて後悔)
中の様子を何枚かパシャってきました。



んー。まじで帰国した気分になりましたw 売ってるものの半分は日本製品だった気がします。 旅行全体の感想ですが、香港には日本のものがめちゃくちゃ入ってきている印象を受けました。 異国の地に来ている割に、何となく安心感ありますね。

寄り道を終え、島の西側を目指します。行きは地下鉄でしたが、今度はトラムに乗ってみます。 香港のトラムはバスと同様2階建てです。やはり人口が多い分、大きな輸送力を確保する必要があるのでしょうか。

香港のトラムは後ろ乗り前降り、降車時に料金を支払います。料金は何処まで乗っても一律で、大人3HKD(=60JPY)です。激安。香港の公共交通はどれも安めです。

ただ安い代償として、トラムの保線状況は正直言って最悪の部類です。時折車体が壊れないか心配になるレベルの音を発しながら走行していました。その上椅子はプラ製で硬い。。長時間乗るのはしんどいですが、大量に走っていて安いので、街中をちょろちょろ動き回る足としてはとても優秀だと感じました。また、2階建てであり窓がないので、香港の街中の景色を開放的な車内から大いに楽しめました。

相変わらず日本のものがよく目に入ります。


あとこれは香港旅行全体の気づきなのですが、香港では建築工事に使用する骨組みに竹が使われているケースが非常に多かったです。現地人の竹への信頼をひしひしと感じました。竹は丈夫なのでそういう用途に使う気持ちは分かるんですが、特に加工もせずその辺から切ってきたような竹をそのまま舗装された道の上に立てて組み上げており、すごく不安になりましたw この光景は街のそこら中で見られたのですが、老朽化した建物を一斉に改修しているんでしょうかね。中々味のある光景でした。


ちなみに、旅行中比較的大規模な駅前にタワマンを建てているのを見たのですが、そこでは流石に金属製の骨組みが使われていました。建造物の規模によって使い分けているのでしょうかね。
道中に大量の鳩がいたのですが、極度に人慣れしていて近づいても全然逃げませんでした。30cmぐらいまで近づいてようやく飛んで行きました。ここまで慣れている鳩は日本でも見たことないです。

お腹が空いたので、あらかじめ行きたい場所としてリストアップしておいた飲食店に来ました。 パート1で書いた点心の店に続いて、この店でも知らない人と相席になりました。特に喋ることはなかったです。
パイナップルパンというのが香港名物として人気らしかったので、それをオーダーしました。あとエッグタルトと飲み物。エッグタルトもまた、香港名物です。名前がパイナップルパンなので、パイナップルが入っているかと思いきや、実は日本でいうメロンパンにあたる食べ物です。特にパイナップルの味はしません(メロンパンもメロンの味しませんが)。ふわふわで美味しかったですよ~。飲み物はレモンアイス珈琲にしました。その日はそれなりに暑かったので冷たい飲み物を頼んだのですが、いざ飲んでみるとめちゃぬるくてずっこけました。日本でこれ出したらクレームものだと思いますw が、聞いた話によると、現地の人はあまり冷たい飲み物を飲まないらしいですね。


気になるお会計ですが、写真にうつっている分と同行者1名分の飲み物を合わせて、合計71HKD(=1420JPY)でした。一人700円程度なので、安めでしたね。店員さんも陽気な感じでよかったです。ごちそうさまでした。
その後適当に街をぶらぶらしていたら日没が近づいてきたので、目当てにしていたヴィクトリア・ピークに向かいます。 有名な100万ドルの夜景を見るには、ピークトラムというケーブルカーで山を登る必要があります。ピークトラムのチケットは事前に予約できます。一応当日券も売っていますが、自分が現地に行ったときに見た当日券の購入待ち行列がとんでもなく長かったので、おすすめしません。 ピークトラムの公式HPからも買えますが、今回はklook(https://www.klook.com/ja/)というサイトで買った方が安かったのでそちらから購入しました。往復チケットとスカイテラス428という展望台の入場料のセットが2100円程度でした。klookの初回クーポンが効いたというのもありますが、公式で買うと150HKD(=3000JPY)ぐらい取られるので大分お安くなりました。
山を登っていきます。トラムは10分間隔ぐらいで運行しているので、そんなに待たされることなく乗車できました。写真だと伝わらないと思いますが、かなーり急勾配の坂を登っていくのでちょっとビビります。公式の情報によれば最大勾配は25度らしいです。ちなみに、日本一の急勾配と言われる大阪奈良の暗峠の最大勾配は37度らしい。

10分ぐらい急勾配にビビりながら、山の上に到着。展望台に登ります。
よく写真で見る光景が広がっていました。 細長い建物が隙間を縫うようににょきにょきしてます。これは夜景も期待できそうです。 ちなみに以下の写真は大体17:30ぐらいに撮ったものです。 登った段階で大混雑かと思っていましたが、まだ日没前ということもあってか想像より空いていました。


日没が近づいてくるにつれて、どんどん人が増えてきました。


20時ぐらいになると、夜景がいい感じになってきました。

月並みな感想ですが、流石世界的に有名な観光地なだけありますね。流石100万ドル。 自分の出身地である神戸市の夜景も日本三大夜景と呼ばれるぐらいには有名でしたが、こちらは建物が全体的に高いのもあってかより迫力を感じました。
夜が更けるにつれてちょっとずつ寒くなってきたので、20時を過ぎたあたりで撤収しました。 帰りのトラムに乗れるまで30分ぐらい待ちました。最初列に並んだ時は長蛇の列だったのですが、意外と早く流れている様子でした。
観光終わりの夕飯
予定していた観光を一通り終えたので香港島を後にし、宿がある九龍半島で夕飯にしました。 大快活という香港で有名な飲食チェーン店に入りました。某ネカフェを思わせる店名です。 国内旅行でもよくやりますが、現地人がよく使うその地特有のチェーン店に入るのが個人的に好きです。 現地人の生活を垣間見れる感じがします。
骨付き鶏の鍋的なメインディッシュに白米と日替わりスープがついたセットを頼みました。中華料理っていうと油マシマシみたいなイメージがありましたが、これは見た目通り超あっさりで優しい味がしました。中々いけます。スープに入っている謎の肉と白米がパサパサだったのは微妙でした。セブンイレブンの冷凍チャーハンもパサパサだったのですが、やっぱり香港の米ってこういう特性なのでしょうか・・・? ちなみにお値段ですが、大体1000円台前半ぐらいだったと思います。日本でも普通にありそう~ちょっと高めの値段だと思います。

こっちは同行者が頼んだ酢豚の定食。こっちの方が中華料理っぽい見た目ですね。かなり甘めの味付けでした。ちょっとだけ食べましたが普通に旨い。こっちも大体値段一緒だったと思います。

閉店が近かったので、食べ終わったらささっと退店しました。店の外観をパシャリ。

というわけで、香港旅行2日目は終了です。
3日目以降はまた次回。
3泊4日香港訪問記(#1 日本出国~ 到着翌日の朝食)
2023年9月に香港を初めて訪問したので、記録がてらそのレポートです。 本当は記憶が薄れないうちに書きたかったのですが、体調不良と論文の〆切が近かったなどの理由で、半月ぐらいギャップが開いてしまいました。
(本記事で登場する諸々の金額は、執筆時の為替レートを参考に1HKD=20JPYでざっくり計算しています)
香港訪問の経緯
時は遡ること2023年6月。 コロナで減少した観光客を取り戻すべく、香港政府が50万枚の航空券を無料配布するキャンペーンをやっていました。
空港使用料や諸税は別途支払いが必要なものの、格安で香港に行けるチャンスだったので結構な反響があったようです。 中々チケット獲得は難しいだろうなと思いながらダメ元で争奪戦に参戦したところ、意外にもあっさり取れてしまい、香港行きが確定しました。 今回はHKExpressという香港の格安航空会社で予約しました。税金やLCC特有の謎手数料諸々込みで、往復25000円。

ちなみに今予約しようとした時の最安直行便は代替50000円でした。大体今回の倍額といったところ。 中々悪くないのではないでしょうか。

日本出発
搭乗便はセントレア第二ターミナルからの出発でした。 2タミは空港の端の方にあるので、移動に時間がかかります。まぁLCCなんで、気が利かないのは仕方ないですね。 1タミと2タミを行き来できる無料バスが運行していたので、それに乗りました。 前からこんなの走ってましたっけ?あまり記憶にないです。
事前のリサーチで調査済みでしたが、搭乗口には日本人ほぼいませんでした。現地人しか乗らない様子。 日本人はいないものと思われているのか、搭乗口にいた日本人の職員に英語で話しかけられました。パスポート見せたら「あっ」って顔されました。

搭乗便は、セントレア17:45発(JST)の香港21:00着(HKT)。日本と香港で1時間時差があります。フライト時間は約4時間。 ちなみに、今回は行きが夕方便、帰りが午前便だったので、タイトルで3泊4日と書いてはいるものの現地を回れるのは2日程度でした。 機材のシートピッチは標準~やや狭いぐらい。ANAの国際線機材に比べればもちろん見劣りするスペックですが、中距離程度であれば問題なさそうです。私は真ん中の席に座りましたが、ラッキーにも通路側が空席だったので楽に座れました。 欧州や北米への直行便に比べれば大したことないフライト時間ですが、劇狭座席だとしんどいなぁと内心ビクビクしていました。

離陸後、飲み物や食べ物は出てきません。フライト24時間前まで機内食や飲み物を事前予約できるようで、その手続きをしていれば離陸後に出してくれるようです。 飲食物の持ち込みは遠慮するよう公式からアナウンスされておりますが、流石に水すらないのは厳しい&正規のルートで買うと高いので、水をカバンに忍ばせて持って行っていきました。安い運賃の代償とはいえ、水すら公式にはアウトってのは辛いですね。 ちなみに、フライト中普通に飲んでましたが、特に何も言われませんでした。すみません。許してください。

香港入国
香港には定刻より30分程度早く着陸しました。 入国審査を済ませて、無事香港に入国。審査時は特に何も聞かれず、顔認証だけされて終わりでした。

入国後したらまずATMに行き、海外キャッシングで現金を得ました。 ヨーロッパなんかだと大体の店でクレジットが使えるのでキャッシュレスな旅行ができますが、香港は割とまだ現金社会のようで、ある程度キャッシュがないと決済に困ります。日本円で2万ほど下ろしました。レートは2023年9月下旬時点で、大体1HKD20円ぐらいでした。昔はもっとレート良かったみたいですが、今は円安なのでちょっと渋いですね。

また香港にはオクトパスカードという決済手段があり、それを使うことで現地の地下鉄・バスなどの公共交通や飲食店での精算ができるようになっています。日本で普及している交通系ICの香港版ですね。かなり多くの場所で使えるので、香港で生活する人必携のカードです。オクトパスカードは1997年誕生、日本初の交通系ICであるSUICAが2001年誕生なので、日本より早く導入されたようです。ちなみにオクトパスカードの中身は、日本の交通系ICと同じくFeliCaとのこと。
オクトパスカードはコンビニや自販機で売っているので、簡単に入手できます。私も空港の自販機でゲットしました。 現地人向けのカードと旅行客向けのカードがあります。 旅行客向けのカードは、旅行後に窓口に行けばチャージ残額を返金してもらえます。

空港でやるべきことを一通り済ませたので、香港の中心地へ向かいます。 空港から九龍という香港の中心地へ出る特急電車が出ているので、それに乗りました。乗車時間は20分程度です。運賃は往復分をまとめ買いすることで安くなり、片道約90HKD(=1800JPY)です。セントレアから名古屋を結ぶ特急電車であるミュースカイは片道1000JPY程度なので、それと比べると高めの値段設定です。 安く済ませたい人はバスを使うといいと思います。
電車の中にコンセントがありました。イギリスにあるタイプの形状です。植民地時代の名残でしょう。普段と違うコンセントを見ると、海外に来たなと感じます。


九龍にある宿泊先のホテルに到着したのが夜の23時ぐらいでした。大体の店はもう閉まっていたので、近くのセブンイレブンで冷凍チャーハンと日本では売っていないシリーズのハーゲンダッツを買って、ホテルの部屋で夕飯にしました。チャーハンの米がタイ米みたいな縦長形状で、その米の特性なのかめちゃくちゃパサパサしてました。びみょい。
ちなみに香港のコンビニですが、セブンイレブンとサークルKの2大勢力のようでした。ファミマとローソンはなかったです。

香港2日目・朝ご飯を求めて移動
よく寝て、2日目です。部屋のカーテンを開けると、ホテルに来たときは夜の暗さで見えなかった景色とご対面。 手前の建物のボロさと奥の新しそうな建物の対比が不思議な感じ。丁度今、老朽化した建物の建て替え工事が進んでいるようです。このような景色が楽しめる期間はそう長くないのかもしれません。

バスに乗って市街地へ繰り出します。今日の観光地である香港島へ向かいつつ、朝ご飯を食べに行きます。
香港市街地には大量のバスが走っており、現地民の足としての役割を果たしています。 香港は土地面積が東京の半分程度というのもあり、土地がべらぼうに高いので、一般階級の人がマイカーを所有して移動するのは難しいのかもしれません。
日本の主要な路線バスとの最大の違いは、運行機材がダブルデッカーであることでしょうか。一応マイクロバスみたいなのも走っているのですが、需要が少ない路線を担当している本当に現地民向けのバスらしく、観光客は基本的にこのスタイルのバスに乗ることになります。

運賃はどこまで乗っても定額で、路線によって運賃が異なります。このあたりのシステムは日本の都会を走るバスとほぼ同じですね。 運賃は大体100円台に収まるぐらいです。日本のバスだと安くても200円ちょっと取られるので、安いですね。
ちなみに路線毎に決まったダイヤは特になさそうな雰囲気で、各線大体これぐらいの時間間隔で走ってるよ~という情報がバス停の案内に書いてありました。GoogleMapだと到着時刻が出ていたので、ダイヤも存在するかもしれません。が、その通りに来たことはありませんでしたw まあ、時間に厳しい日本ですら路線バスは遅延しがちなので、時刻表作ったところでそれ通りに走るとは思えませんし、これぐらいで丁度いいのかもしれません。


バスに乗り込みます。バス入り口にICカードをスキャンする機械があるので、そこにオクトパスカードをかざして運賃を支払います。せっかくのダブルデッカーなので、バスに乗り込むやいなや2階の最前列へ向かいます。意外と車内は空いていました。今回の香港旅行ではたくさんバスに乗りましたが、ほとんどの場合席を選んで座れるぐらいにはキャパに余裕があり、座れなかったことは一度もありませんでした。これダブルデッカーで走る必要ないのでは・・・?と思ったのは内緒です。
日本の長距離バスに乗ったときの視線より高く、中々良い眺望でした。バスの運転手が前との距離をガンガン詰めるので、ぶつかるんじゃないかと心配になりましたが、加減速は割と丁寧でした。丁度1年前に出張でカナダに行ったときに乗ったバスの運転がまぁひどかったので、内心ちょっとビビっていました。

十数分バスに揺られて、今度は船に乗り換えます。香港中心部は九龍半島と香港島の2つに分かれており、これらの間は船と地下鉄で行き来ができます。2日目は宿泊地の九龍半島から香港島へ向かい、1日かけてザザーっと観光するプランとなっています。

船の運賃は片道100円ぐらいだったと思います。激安。まだ地下鉄が登場していませんが、香港の公共交通は全体的に安めです。10分ぐらいのクルーズ。ちなみに船自体は15分間隔ぐらいで出ているらしいので、特に出港時間を調べる必要はありません。


船を降り、またバスに揺られてしばらく行ったところで、最初の目的地である朝ご飯会場に到着。 地元民に人気の飲茶の店らしい。いかにも地元民向けという雰囲気が漂っており、一発目からここに入るのは中々勇気がいります。

おそるおそる店の中をのぞいたところ、店員のおじいちゃんが手招きしていれてくれました。通された席には既に客が座っており、現地民と相席。特に喋ることはなかったですが。
入店後漢字だらけのメニューと格闘していたところ、外国人だと察した店員さんが英語版メニューを持ってきてくれましたw ありがとうございます。 一応事前に頼むものは決めてあり、その漢字表記もメモっておいたのですが、中々厳しいですね。ちなみに店員さんに英語はほぼ通じませんでしたので、身振り手振りで何とかしました。

メニューとにらめっこしている間に、水(お茶?)に浸かった食器が目の前に出てきました。 これは「洗杯」という、食事前に皿をお茶で洗う広東の習慣らしいです。かつて香港のレストランは衛生状態が悪かったので、客自らが皿を洗って綺麗にする文化が生まれ、それが現在にも残っているという経緯があるとのこと。最近は衛生的なレストランが増えてきたのでその必要はなくなったようですが、こういうローカルレストランではまだ見られるみたいです。今回は外国人だと気づかれたからか、店の人が目の前で洗ってくれました。地元密着の店はこういうのを体験できるのが良いですね~。ただ、正直これで皿が綺麗になっている気は全くしませんw

メニューを指さして注文して一息したところで、料理が出てきました。注文から30秒も経ってない気がします。何が何でも早すぎる。 手前の白いのが牛肉腸粉(牛肉の米粉巻き)、左奥がシュウマイ、真ん中奥が(何味か忘れた)蒸しパン、右奥がエビシュウマイ、です。 一番手前の料理は日本ではあまり見慣れませんが、もちもちした米粉の生地に牛肉を挟んで醤油ベース(?)のタレをかけたものです。もちもちしてて美味しかったです。

追加でチャーシュー饅と鶏の足を頼みました。チャーシュー饅は生地が甘め。鶏の足は醤油ベースの味付けで、めちゃめちゃプルプルした食感でした。コラーゲンですかね。鶏の足ってそのままガブッと食べられると思ってたんですが、中に骨があるので手羽先の要領で食べないと歯がやられますね。(まぁちょっと考えれば分かる話なんですが)

写真に出ている分で、お会計は131HKD(=2620円)でした。2人で分けたので一人1300円ほどでした。日本の感覚だと1000円ぐらいで収まると思ってましたが、全然問題ない価格だと思います。日本の外食はまじで安すぎます。
この後香港島をザザーっと回りますが、長くなってきたのでまた次回。
続編↓
【10時打ち】サフィール踊り子グリーン個室の予約に挑戦
GWにサフィール踊り子のグリーン個室に乗りたく、入手困難なグリーン個室券を奪取すべく人生初の10時打ちに挑戦しました。
サフィール踊り子とは
JR東日本が運転する東京~伊豆急下田間で運行されている観光列車です(臨時のサフィール踊り子5号は新宿発)。全車両がグリーン車で構成されるスーパーデラックスな列車となっています。
ちなみに昔スーパービュー踊り子という列車もありましたが、サフィール踊り子と入れ替えになる形で廃止されています。
10時打ちとは
グリーン個室券をはじめとするJRの指定券は、運行日の1ヶ月前10時から発売されます(旅客営業規則第21条4)。この発売日の10時を過ぎた直後に指定券を発券してもらう行為を10時打ちと呼びます。人気な列車の座席はそうでもしないと予約できません。
10時打ちの具体的な手法としては、
- 事前に申込書を窓口に提出して、10時丁度に発券してもらうよう手続きする
- 10時前にみどりの窓口や全線切符売り場へ並び、窓口の駅係員に10時丁度に発券してもらう
といったものがあります。しかし自分が調べる限り、ここ数年は前者の手法に対応する窓口は少なく、後者の手法を10時打ちと呼ぶことが多いようです。(後者についてもやっているところとやっていないところがあるとか)
もっとも、JRが公式に案内しているサービスではないため、そのあたりは曖昧です。あくまで非公式ではあるが、電車好きの間では認知されている行為だという程度の話です。
これより詳細は僕より遥かに詳しい方々がたくさん記事を書いていますので、そちらをご覧ください(クソ適当ですみません)。
サフィール踊り子のグリーン個室は1編成あたり、1~4人用の4室と1~6人用の4室の、計8室しか存在せず、さらに上り下り合わせてそれぞれ1日2本しか走っていないため予約枠が少ないです。その上人気な席ですので、発売開始と同時に予約する10時打ちがほぼ必須だと思います。ましてや今回のような繁忙期の券は尚更です。
ちなみにこれは余談ですが、東海道新幹線の700系ラストラン(2020年3月8日 のぞみ315号 東京発新大阪行)の切符は発売から8秒で売り切れたそうです。ひえー。
10時打ち駅の選定
10時打ちをする上で重要な要素である、駅の選定を行います。
10時打ちを実行する駅の条件として、個人的に以下を設定しました。これらを満たす近所の駅を探します。
- 窓口が複数ある中規模以上の駅
- 10時打ちの実績がある駅
各条件の詳しい説明ですが、まず1つ目の「窓口が複数ある中規模以上の駅」というのは、
- そもそも発券機がない小規模な駅では発券不可能である
- 窓口が少ない小規模駅だと10時打ちで少ない窓口のうちの一つを占領することになり、他の客に迷惑がかかる
という理由からです。あくまで非公式のサービスなので、周りに極力迷惑がかからないよう配慮するべきでしょう(鉄オタに対する社会からの風当たりは強いですから・・・)。
2つ目の「10時打ちの実績がある駅」というのは、
- 駅側の都合でそもそも10時打ちをしてくれない駅がある
らしいからです。まぁ非公式のサービスですので、断られても文句は言えません。やってくれる駅員とやってくれない駅員がいるみたいな話もあり、当日になってみないと分からないところもありますが、最低限過去に実績のある駅かは確認したほうがいいでしょう。私は Twitter や YouTube で「○○駅 10時打ち」や「△△市内 10時打ち」などのワードで検索し、各駅の実績について調査しました。
私はこの調査の結果、名古屋市内の某駅で10時打ちを決行しました。(駅名は伏せますが、愛知の人なら多くの人が知っているレベルの駅です)
10時打ち当日
先客がいると10時丁度に発券してもらえない可能性があるので、当日は8時半頃に駅へ着くように向かいました。窓口で10時丁度に発券してほしいとお願いしたところ、引き受けていただけました。先客もいないようでしたので、無事1番目になりました。10分前ぐらいにもう一度窓口へ来るように言われたので、時間になるまで近くのカフェで珈琲を飲みつつ暇潰し。待っている途中に係の方から電話があり、「9:55頃になったら右から○番目の窓口に来てください。切符売り場の入り口に人が並んでると思いますが、並ばずにそのまま窓口前までお願いします。」というお知らせを受けました。非公式なのに丁寧でびっくりです。
言われた通りの時間に電話で伝えられた場所へ向かうと、自分が入るための窓口を既に空けてくれていました。「変な客ですみませんありがとうございます」と心の中で感謝しながら、係の方に予約情報を伝えました。予約情報を一通り発券機に入力した後、係の人が奥の方へ消えていったと思ったら、電話機で時報を鳴らしはじめました。さすが時間厳守の世界です。
待つこと数分いよいよ時間となり、10時丁度を告げる時報と共に、係の方が発券機のボタンを一つ叩きました。数秒の静寂の後・・・、「席が取れました」と係の方からお知らせいただき、無事グリーン個室券獲得となりました。
大学生協旅行センターという穴場
と、無事JRの窓口で10時打ちに成功したのですが、実は失敗したとき用に一つ保険をかけておりました。
ご存じの方もいると思いますが、JRの切符が買えるのは駅窓口だけではありません。実は私が在学する名古屋大学の生協旅行センターにもJR切符の発券機が設置されており、指定券の発券が可能です。普段から学割で乗車券を買う際に散々お世話になっています。
Tweets by nucoop_ryoko twitter.com
10時打ちについて色々と調べていると、実はその生協旅行センターでも10時打ちが可能なことが分かりました。さらに生協旅行センターのすごいところは、事前に申込書を窓口に提出しておけば当日窓口に行かなくても10時丁度に発券手続きをしてくれ、その結果を電話してくれるという点です。つまり、紹介した方法の内の前者側(現在駅では取り扱いのない方法)に対応しているということです。これはすごい。
今回自分はJR窓口で券が取れなかった時に備え、生協旅行センターの方でも事前に10時打ちをお願いするという2段構え作戦を実行しました。
しかし発券機は1台のみであり(1台あるだけでも凄いと思いますが)、当日は予約順に発券されるため、予約に先客がいると10時丁度の発券はできません。予約受付開始のタイミングは分かりませんが、できるだけ早く予約をするべきでしょう。ちなみに、自分は10時打ち前日の昼頃に予約しにいきましたが、その段階で既に臨時サンライズ出雲の10時打ち予約が入っており、自分は2番手でした。ぴえん。でも逆に、GWという最繁忙期運行分の券であっても前日昼までに予約すれば2番手になれると思うとすごいんじゃないですかね、これ。
で、結果はどうだったんだという話ですが、なんと生協の方でも予約が出来てしまいました。予約2番手なのに取れるとは思いませんでした。厳密には、自分がJR窓口で取ったのは 14:18伊豆急下田発のサフィール踊り子2号でしたが、生協に予約をお願いしたのは16:39伊豆急下田発のサフィール踊り子4号でした。後者は発車時刻が遅めなので、比較的人気がない列車だったのかもしれません。申し訳なかったですが、生協の方は払い戻し手数料340円を支払って放流しました。担当者の方、すみませんでした。。
さいごに
中々できない体験ができて楽しかったです。
生協の旅行センターは長い列に並ばず学割乗車券が買えるので重宝していましたが、まさか10時打ちまでできるとは思わず、在学6年目にして新たな発見でした。
弊学科の掲示板botはどのようにして動いているか
はじめに
私が学部時代に所属していた名大工学部の電気系電子掲示板の更新情報通知bot(@NUEE_Notify)を公開してから1年以上が経過しましたが,botのロジックがどうなっているかみたいな話をしたことが無かった気がするので,何となく書き残しておきます.適当ですが.
botが生まれた経緯
「毎日掲示板をチェックすること」を大学側から要求されているものの,毎日忘れずに手動でチェックするのは現実的に不可能なので,なんとかしたいなと思って作りました.
大まかな流れ
更新の流れですが,
の2ステップです.
webスクレイピングした結果をゴニョゴニョして,その結果をTwitterAPIで投げるだけという極めてシンプルなもので,難しいことはほとんどしていません.
掲示板ページの巡回
1時間に1回の頻度で差分検出スクリプトが実行され,更新があるかを確認します.スクリプトは自宅のラズパイ上で動いています.
詳細な流れとしては,
という感じです.
CAS認証には自分の名大IDとPasswordを使っています.
最近CASが2段階認証に対応しやがったなさった&短時間に連続でサーバにアクセスすると一定時間アクセス拒否されるようになったので,
前よりちょっと面倒になりました.
また私の個人IDを使って認証を行っているという特性上,私の名大IDが失効した時点でこのbotはサ終となります.(名大IDって卒業後はどういう扱いになるんでしょうか・・・)
htmlの取得はPythonのBeautifulSoupくんでやっています.Pythonって何でも出来ますよねぇ. 掲示内容の抽出はこのフェーズで行います.
最後に更新検出ですが, 各掲示内容には下の画像のように,最初に掲示内容が公開された日時を示す「登録日」と,最後に加筆修正された日時を示す「最終更新日時」という要素が登録されています. この「最終更新日時」が前回のラズパイによるページ巡回時刻より後だった場合,記事に更新があった or 新着の内容がUPされた という認識をしています.

TwitterへのPOST
これについてはTwitter APIを叩くだけで,特に何も言うことはありません.
「APIってなんやねん」という疑問についてはネットの海に分かりやすい説明がたくさんあるのでここで詳しく説明はしませんが, 簡単に言うならば,「アプリケーション(Twitter, LINE etc.)内の情報を外部から取得したり,アプリケーション側に情報を送ったりできる仕組み」みたいなものです.
(あまり説明すると不備が生じて,つよいエンジニアに突っ込まれそうなのでやめておきます.)
おわりに
botのロジックの話とはいいましたが,ロジックというほどの内容じゃなくてすみません. 実はこのbot,Pythonの練習を兼ねて作ったので,今から見るとコードの書き方が変だったりします. リファクタしたいのですが時間が無い・・・.
トラブったときに世話になりがちな個人運営の有能技術系ブログを目指したいんですけど,技術がないのできびしい.
ABC179感想戦A~E
ABC179おつかれさまでした. 競プロ復帰から早1か月が経過しました.あれからレートはほとんど変化なしです(は?)
レート変化
524→549(+25)です.パフォは735で,一応Highestは更新しました.
緑までの道のりはまだまだ長いです.

A:Plural Form

文字列の末尾を見て”s”を付けるか”es”を付けるか判断するという問題です. 実際の英語とはちょっとルールが違いますが, 実際の英語に即して末尾を判断するとなると,それはもはやA問題の守備範囲ではありませんね()
文字列の扱い方だけ分かっていればやるだけです. ifで振ってあげてACしました.大体1分.
B:Go to Jail
サイコロを2個振る試行を$N$回行った結果が与えられ,ゾロ目が3回以上連続で出たかどうか判定する問題です. これについても問題のまま素直に実装してやればすぐですね. ゾロ目の連続記録が途切れた時にカウンターをリセットすることを忘れないように. ここまででちょうど6分.
C:A×B+C
問題は非常にシンプルですが,制約が$N\leq10^{6}$なので適当に実装すると即TLEして詰みます. 適当に$A, B, C$それぞれを全探索すると$O(N^{3})$なので,まず終わりません.
まず$C$については$A, B$を決めてしまえば一意に定まるので,$A, B$だけ考えれば十分です. さらに$A$に対して$B$は$\frac{N-1}{A}$個存在することになるので($C\neq0$なので$\frac{N}{A}$ではない), Aについて1~$N$まで全探索してやれば$O(N)$で解が導けます.
自分の提出コードの場合数え方が想定解と違いますが,発想は同じでした. ここまでで約28分. 緑に行くにはもっと早くC問題を突破する必要がありそうです・・・.
D:Leaping Tak
「D問題のDはDPのD」という言葉通り,DPをやる問題です. ・・・が,そのまま素直にDPすると$O(N^{2})$なので制約的にTLEまっしぐらです. 自分の場合DPをすることには気づいたのですが,計算量を$O(N^{2})$から落とす方法が分かりませんでした. 「もしかしたら通るんじゃね(無謀)」という考えのもととりあえずDPを普通に書いて提出しましたが, 予想通りTLEして撃沈しました(残当).
解説では累積和を用いてDPを高速化する手法を用いていました.

イメージとしては上図のような感じです. 上の方法ではそれぞれ個別で足すので最悪$N$回の足し算が発生しますが, 下の方法では区間ごとにまとめて足してしまっているので,最悪でも$K$回の足し算しか発生しません. 区間の和については累積和をとりながらDPをすることで$O(1)$で取得できます. したがって下の手法を用いることで$O(KN)$まで計算量が削減され,時間内に処理が終了します. 移動できるマス数が区間で与えられているというのがミソでした. これ本番で思いつくの結構大変だなぁ・・・.
E:Sequence Sum
「余りの問題はループが発生していないか見よ」と聖書にもあります(ない). というかこれどっかのABCと発想ほぼ同じ問題やんけぇぇぇ!!! 何故ACできなかった????精進の大切さを改めて感じました.
これです ↓ atcoder.jp
素直に漸化式に従って余りを順番に足していくと計算量は$O(N)$となりますが,これでは制約的に間に合いません.
鳩ノ巣原理から$A_n$には高々$M$個の値しか現れません. さらに漸化式から,数列$A_n$は一部がある一定周期でループします.

上図のようなイメージになります. 状態を
(i) ループに入る前の部分 (ii) ループの部分 (iii) 終了に伴いループしきれなかった部分
の3セクションに分解に分解すると,求める値は
(i)+(ii)×ループ回数+(iii)
となり,$O(M)$で求まります.
本番中は(i)のセクションの存在を忘れており,ACできませんでした. うーんこれはACしたかった問題です.方針が一瞬で浮かんだだけに悔いが残ります.
最後に
ACはできなかったもののDとEの大まかな解法は本番中に一瞬で出てきたので, ある程度精進の成果は出ているのかなというように思います. この調子で頑張ろうと思います.
あとDとEの難易度逆転が最近多い気がするのは気のせいですかね?? DとEは両方見る癖をつけたほうが良い気がします.
ABC178感想戦
前回のABCは外出していて参加できなかったので,3週間ぶりの参戦となりました. 今回も感想と反省を書き残しておきます.
レート変化
511→524です.ほぼ誤差の範囲ですが温まりました. 復帰してから±20ぐらいでレートが振動しているので脱却したいところです・・・.

A:Not

0か1が入力xとして与えられて,0がきたら1を,1がきたら0を出力せよという問題. ifでやるか,xorでやるか,!xでやるか,人それぞれだと思いますが, 上位の人を数人見ると全員!xでやっていました. 自分はifで振りましたが,!xは芸術点高いなぁと思いました.簡潔でよい.
B:Product Max

掛け算の最大値を出力する問題. 制約的に全探索は間に合いません. 整数$x,y$の定義域の端同士の掛け算だけして最大値を求めれば十分なことにはすぐ気づきました. (本当に良いかあまりよく考えずに提出したのでちょっと危なかったかも)
ちなみに自分は急ぐあまり,最初は整数$a,b,c,d$の積の最大値を求める問題だと勘違いし, 余計な時間を使ってしまいました. 毎回問題の読み間違いをやってるので気を付けないといけませんね,反省.
C:Ubiquity
最初見た時は高校の数Aじゃんって思いました. 4年前まで現役高校生で,しかも現在塾で高校生を教えているのでこんなのすぐACだわ~って思ってたら甘かったです()
考え方はあっているはずなのになぜかテストケース5つぐらいでWAを発生させ, 結局デバッグコード消し忘れなどのポカをやって6WAしました. 結局終了10分前にACし,ここで終了しました.敗因はMODの扱いです.
この問題のように答えが非常に大きくなる場合, 答えをMOD$=10^{9}+7$で割って出力するというのは競プロerにはおなじみですが, 自分自身新参者なのであまりこの方法に慣れていませんでした. 答えを出す過程で計算結果を適宜MODで割っていくわけですが, そのMODで割っていって出てきた答えを最後に合算した時, 答えがマイナスで出てくる可能性があることを失念していました.
解説ではこれを回避するために,答えを
ans = (ans+mod)%mod
と修正して出力していました. 自分は合算する度に答えがマイナスになっているときといないときの処理を条件分岐でやっていたので, これを見た時天才かよ!!!って思いました. 確かにこれならプラマイがどうであれ関係ないです.この処理は覚えておこうと思いました.
ちなみにこれDPでも解けるらしいです.時間あったら考えてみたい.
D:Redistribution
またMODで割るやつです. C問題で無限に時間を取られたので本番中はほぼ見てません.
解説を読んだところDPするのが良いみたいです. 「D問題のDはDPのD」という言葉の通りですね.
解説をぱっと読んだ感じ,これだと数が出てくる順番考慮されるんか??($(3,4)$と$(4,3)$が区別されて出てくるの??)って思いましたが, 手動でやってみたらこれでうまくいくことが分かりはえーってなりました.DPすげぇ.(こなみかん)
DPってどういう漸化式を立てるかが勝負だと思うので, 解説読んじゃうとダメな気がするんですよね. 解説を読むとただそれに従ってDPを回すだけになっちゃうのであまり意味を感じないというか・・・. (確かに実装できることも大事だと思っていますが・・・)
E:Dist Max
座標が$N$点与えられて,それらのマンハッタン距離の最大値を求める,という問題. どうやらマンハッタン距離の問題は45度回転という頻出テクニックがあるようです.(そんなの知らん)
式変形は省略しますが(書くのがめちゃめちゃめんd(ry),$i$番目の点$(x_i , y_i)$について$z_i=x_i+y_i$ ,$w_i=x_i-y_i$という座標変換を施すことで, $m$番目の点と$n$番目の点のマンハッタン距離は $$max(|z_m-z_n| , |w_m-w_n|)$$ となります.
以上より$z_i=x_i+y_i$ ,$w_i=x_i-y_i$の最大値及び最小値をそれぞれ求めてあげれば,マンハッタン距離の最大値が求まります. $N$点について$z_i$と$w_i$を求めればよいので,計算量は$O(N)$となり間に合います.
マンハッタン距離については,このページを参考にしました. ↓ kagamiz.hatenablog.com
まぁ知ってれば数分で実装できますが,知らないと無理ですな.
最後に
今回も経験のなさが露呈してしまいました,はい. MODの扱いについては収穫あったかなって感じです. 過去のABCにバーチャル参加して精進しようと思います.
ABC176感想戦A~E
復帰後2回目のABC参戦です.一夜明けた今日,とりあえず解説動画を見ずにEまで自力で通しました(文の解説は見ましたが・・・).備忘録がてら感想等残しておきます.
レート変化
528→511です.無事に冷えました!!!!前回511→528だったので,元に戻った感じですね()

今回はCまで特に悩むことなく通せていたので期待できそうだと思ったのですが,皆余裕でCまで通していたみたいで相対的に自分の順位が落ちてしまったみたいです.レート冷やすとモチベーション下がるなぁ.
A:Takoyaki
「1脚6人掛けの椅子に25人座らせるためには何脚の椅子が必要ですか?」的な問題ですね.小中学校の算数数学で嫌ほど見た記憶があります.
まとめて焼き切れずに残ったたこ焼きを最後処理するのに,一回分の時間が余計にかかってしまうというのがこの問題のポイントです. 先述の椅子の問題でいうと,24人座らせるには椅子を4脚用意すればいいけれど,残り1人を座らせるために余分に1脚必要になる,といったところです.
この問題の場合,$\frac{N}{X}$にあまりが生じるかどうかで場合分けをし,あまりがなければ$\frac{N}{X}\times{}T$を出力し,あまりがあるなら$(\frac{N}{X}+1)\times{}T$を出力すれば解になります.
int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); cout << fixed << setprecision(15); int n, x, t; cin >> n >> x >> t; if (n % x == 0) { int num = n / x; cout << t * num << endl; return 0; } else { int num = n / x + 1; cout << t * num << endl; return 0; } return 0; }
本番中はなぜか綺麗に書こうとして場合分けの代わりにceilを使ってしまい,沼にハマりました. 綺麗さを求めて変に一般化しようとして失敗する典型例ですね. 結局通すのに8分ぐらいかかった気がします.そりゃ冷えるよなぁ.
B:Multiple of 9
与えられた数が9の倍数か判定する問題です. 制約が$N\leq{}10^{200000}$なので,数値として読み込むとオーバーフローします. だから文字列として読み込んで倍数判定法使ってね,っていう趣旨の問題です. (”たばいちょうせいすう”なるものを使うと数値として読み込んでもできるらしい.はえーすっごい.)
int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); cout << fixed << setprecision(15); char num_str[1000000]; scanf("%s", num_str); char *num_ptr = num_str; int count = 0; int sum = 0; while (*num_ptr != '\0') { int tmp = num_str[count] - 48; sum += tmp; num_ptr++; count++; } if (sum % 9 == 0) { cout << "Yes" << endl; } else { cout << "No" << endl; } return 0; }
まぁそのままやるだけです. そのままやるだけなんですけど,文字列を1文字づつ分離するところで結構時間かかってます. これも今回の冷えの原因です.
C:Step
人が1列に並んでおり,それぞれの人の身長が与えられます. 前の人よりも身長を高く,ないしは同じになるように人に踏み台を与えていきます. この時トータルで踏み台を最低いくつ与えればよいでしょう,という問題です.
なんかこの問題どっかで見た気がします・・・.
1~$i$人目まで見た時,その中で一番身長が高かった人の身長を$max$という変数に保持します. この時$i+1$人目の身長が$max$以下であれば,$max$とその人の身長の差分だけの高さの踏み台を与えます. $i+1$人目の身長が$max$より高ければ,$max$を$i+1$人目の身長で更新し,次の人を見ます. これを最後まで繰り返し,与えた踏み台の総和を出力すれば解となります.
int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); cout << fixed << setprecision(15); int n; cin >> n; vector <int> a(n); rep(i, n) cin >> a[i]; ll max = a[0]; ll ans = 0; for (int i = 1; i < SZ(a); i++) { if (max < a[i]) { max = a[i]; continue; } else { ans += max - a[i]; } } cout << ans << endl; return 0; }
これについては3分ぐらいでACした気がします.
D:Wizard in Maze
迷路探索の応用です. 迷路の探索はやったことがあるので方針はすぐ浮かびましたが, 実装がまずくオーダーが落としきれずにTLEしました.
単に最短経路を求めるだけなら普通のBFSで終了ですが, 今回はワープのコストという概念があるのでそれだけでは無理です.
今回の場合,0-1BFSという手法でうまくいきます. 通常のBFSと異なるのは, deque(前後どちらからもpush,popできるqueue)を用い, ワープせずに移動した移動先を前にpushし,ワープを用いて移動した移動先を後にpushするというところです. これによってコストが低いもの(=ワープ回数が少ないもの)から優先的に探索が行えます.
char mp[1005][1005]; int cost[1005][1005]; int h, w; deque <tuple <int, int, int, int, bool> > deq; int ch, cw; int dh, dw; bool end_fg = false; void bfs(int x, int y, int cst) { if (end_fg) { return; } if (x < 0 || y < 0 || h <= x || w <= y) { return; } if (mp[x][y] == '#' || cost[x][y] != -1) { return; } else { cost[x][y] = cst; } if (x == dh && y == dw) { end_fg = true; return; } for (int i = -2; i < 3; i++) { for (int j = -2; j < 3; j++) { if (i == 0 && j == 0) { continue; } else if ((i == -1 && j == 0) || (i == 1 && j == 0) || (i == 0 && j == -1) || (i == 0 && j == 1)) { tuple <int, int, int, int, bool> tmp = make_tuple(i, j, x, y, false); deq.push_front(tmp); } else { tuple <int, int, int, int, bool> tmp = make_tuple(i, j, x, y, true); deq.push_back(tmp); } } } } int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); cout << fixed << setprecision(15); cin >> h >> w; cin >> ch >> cw; ch--; cw--; cin >> dh >> dw; dh--; dw--; rep(i, 1005) { rep(j, 1005) { cost[i][j] = -1; } } rep(i, h) { char tmp[1005]; cin >> tmp; rep(j, w) { mp[i][j] = tmp[j]; } } bfs(ch, cw, 0); while (deq.size() != 0) { tuple <int, int, int, int, bool> next = deq.front(); deq.pop_front(); if (get <4>(next)) { bfs(get <0>(next) + get <2>(next), get <1>(next) + get <3>(next), cost[get <2>(next)][get <3>(next)] + 1); } else { bfs(get <0>(next) + get <2>(next), get <1>(next) + get <3>(next), cost[get <2>(next)][get <3>(next)]); } } /*rep(i, h) { rep(j, w) { cout << cost[i][j]; } cout << endl; }*/ cout << cost[dh][dw] << endl; return 0; }
解説記事を読んだときは少し感動しました.面白いですね.
E:Bomber
爆破できる爆破対象の数を最大化する問題です.
爆弾と同じ行,列にある爆破対象が爆破できるので, 単純に爆破対象が一番多い行と列を探し,その行と列の交点に爆弾を置けば, (行にある爆破対象)+(列にある爆破対象)が爆破され解になるのでは? と本番中は思ったのですが, 爆弾を置いた場所に爆破対象があった場合その限りでないことにすぐ気づきました. (交点の爆破対象が2重に計上されるため,実際は1つ減ってしまいます.)
本番中はなんかめんどくさそうだなぁと思ってスルーしました. (実際Dの方がめんどくさかった.)
爆破対象が最大になる行および列は複数ある可能性があります. 爆破対象が最大になる行の数を$hctr$,爆破対象が最大になる列の数を$wctr$とすると, 爆弾を置く候補地は$hctr\times{}wctr$となります.
もしこの候補地全てに爆破対象が存在した場合, どこに爆弾をおいたとしても(行にある爆破対象)+(列にある爆破対象)-1の爆破対象しか爆破できず,これが解となります. 逆に爆破対象のない候補地が存在した場合, そこに爆弾を設置することで,(行にある爆破対象)+(列にある爆破対象)の爆破対象が爆破できます.
int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); cout << fixed << setprecision(15); int h, w, m; cin >> h >> w >> m; vector <int> hbomb(h, 0); vector <int> wbomb(w, 0); vector <pair <int, int> > bomb(m); rep(i, m) { int tmp1, tmp2; cin >> tmp1 >> tmp2; tmp1--; tmp2--; bomb[i] = make_pair(tmp1, tmp2); hbomb[tmp1]++; wbomb[tmp2]++; } int hmax = -1; int wmax = -1; int hctr = 1; int wctr = 1; rep(i, h) { if (hmax == hbomb[i]) { hctr++; } else if (hmax < hbomb[i]) { hctr = 1; hmax = hbomb[i]; } } rep(i, w) { if (wmax == wbomb[i]) { wctr++; } else if (wmax < wbomb[i]) { wctr = 1; wmax = wbomb[i]; } } int cross = 0; int pattern = hctr * wctr; rep(i, m) { if (hbomb[bomb[i].first] == hmax && wbomb[bomb[i].second] == wmax) { cross++; } } if (!(pattern - cross)) { cout << hmax + wmax - 1 << endl; } else { cout << hmax + wmax << endl; } return 0; }
なんとなく本番中にもこんな感じのことは考えたのですが, ここまでシンプルにまとまるとは思っていませんでした.
F:Brave CHAIN
なんかTwitterで赤diffなのを見たのでとりあえず放置します()
最後に
アルゴリズムの知識がそれほどない状態でも茶にはなれましたが, これ以上レートを伸ばすためには基本的なアルゴリズムをしっかり勉強して,それを実装する練習をある程度詰まないと厳しそうだなぁと感じました・・・.特に実装の経験が全然足りないです.過去問をひたすら解いて勉強します・・・.
競プロ復帰戦(ABC175感想戦A~E)
大学の課題とかに追われていたのもあって,半年ほど完全にサボっていました. 夏休みに入って再び時間ができたので,これを期に復帰することにしました. 復習をサボらないように,あと備忘録的なものを兼ねて,ブログ形式で記録をつけることにしました.
ABC152以来の参戦です.いつの間にかABC175まできててびっくりしました.
レート変化
511→528に上がりました.正直誤差の範囲です・・・.冷えなかっただけマシですが・・・.

A:Rainy Season
'S'と'R'から成る文字列が与えられ,'R'が何文字連続しているか答える問題. 文字列の長さが3であることから,文字列のパターンは高々23=8パターンしかありません. 素直に場合分けすればよいです.
int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); cout << fixed << setprecision(15); string s; cin >> s; if (s == "RRR") { cout << "3" << endl; } else if (s == "RRS" || s == "SRR") { cout << "2" << endl; } else if (s == "RSS" || s == "SRS" || s == "SSR" || s == "RSR") { cout << "1" << endl; } else { cout << "0" << endl; } return 0; }
汚ねぇコードだなぁと思いながら書いてたけど,これが想定解らしい.
B:Making Triangle
棒の本数と長さが与えられて,その中から三角形を作ることができてかつ長さがそれぞれ異なる3本の棒の選び方の総数を求める問題. 選んだ棒の組み合わせに対して三角形の成立条件が成立し,かつ選んだ3本の棒の長さがそれぞれ異なるかを判定する,という流れをそのまま実装すればいけます. 棒の数の制約が$N\leq{}100$であることから,全探索しても間に合います.計算量は$O(N^{3})$です. あらかじめ棒の長さでソートしておけば,三角形の成立条件が簡単になるので条件式が書きやすくなります.
int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); cout << fixed << setprecision(15); vector <ll> stick; int n; int cnt = 0; cin >> n; rep(i, n) { ll tmp; cin >> tmp; stick.push_back(tmp); } sort(all(stick)); // stick.erase(unique(all(stick)), stick.end()); if (stick.size() < 3) { cout << 0 << endl; return 0; } for (int i = 0; i < SZ(stick) - 2; i++) { for (int j = i + 1; j < SZ(stick) - 1; j++) { for (int k = j + 1; k < SZ(stick); k++) { if (stick.at(i) + stick.at(j) > stick.at(k)) { if ((stick.at(i) != stick.at(j) && stick.at(j) != stick.at(k) && stick.at(k) != stick.at(i))) { cnt++; } } } } } cout << cnt << endl; return 0; }
最初同じ長さの棒は区別されないものだと勘違いしていて,テストケースと答えが合わず時間を溶かしたのは内緒です. これと後のC問題の2WAで足を引っ張られました・・・.
C:Walking Takahashi
高橋君をできるだけ数直線の原点に近づける問題. まず状況として,次の2パターンに分かれます.
- 移動可能回数が少なく,高橋君が最適解に近づく前に力尽きる場合
- 移動可能回数が十分に大きく,高橋君が最適解に到達できる場合
前者の場合,原点に向かってひたすら移動し,力尽きた地点が最適解となるので簡単です.
後者の場合,解の候補は以下の2点存在します.
- 高橋君の初期位置から$\frac{X}{D}$回移動した位置
- 高橋君の初期位置から$\frac{X}{D}+1$回移動した位置
原点からの距離が最短になる位置(最適解)は上2つのうちのどちらかになります. 以下,最適解を解1,もう一方の解を解2と呼びます.
以上のことを用いると,後者の場合は以下のように考えれば解が求まります.
- 高橋君を解1の位置まで移動させる
- 残り移動回数で解1と解2を交互にぴょんぴょんする
- 最後に止まったほうが解
3の「最後に止まる方」は,1が終了した時点での残り移動回数から求めることができます.
int main() { cin.tie(nullptr); ios_base::sync_with_stdio(false); cout << fixed << setprecision(15); ll x, k, d; cin >> x >> k >> d; ll preans1, preans2; ll idou1, idou2; idou1 = llabs(x / d); preans1 = llabs(llabs(x) - idou1 * d); preans2 = llabs(preans1 - d); idou2 = idou1 + 1; if (preans1 > preans2) { swap(preans1, preans2); swap(idou1, idou2); } if (idou1 > k) { cout << llabs(llabs(x) - d * k) << endl; // answer } else if ((k - idou1) % 2 == 0) { cout << preans1 << endl; } else { cout << preans2 << endl; } return 0; }
一ヵ所llabsを付け忘れていることに気づけず,2WAしました.くそっ. 本番中に解けたのはここまででした.
ここまでは安定して来れるんだけど,D以降はその日の問題の相性にもよるなぁって感じ. A~Cをノーミスで早く解けるようにならないとこの先中々厳しそう.
D:Moving Piece
ここからは本番では解けていません. 一夜明けて,解説を読んでから解いてみました.
最初見た時は全パターン洗い出すことを一瞬考えましたが,制約的に厳しいことにはすぐ気づけました.
有向グラフを描くとジャンプするマスが一定周期でループしていることが分かり,それを用いれば$O(N^{2})$で求まるようです. 知らないアルゴリズムが出てきているわけではないので,気づくことはできたかもしれないなぁ. 「順列ときたら閉路を考える」的な文をTwitterで見たけど,定石なんですかね?
コードはほぼ解説動画の写経なので載せません.
E:Picking Goods
平面を移動してアイテムを回収し,回収するアイテムの価値を最大化する問題.
典型的なDPなのでいけるのでは?と思いましたが, 同じ行でアイテムは最大3個までしか拾えないという条件を加味するというところで分からなくなりました.
既に$k$個拾ったという情報をdpテーブルに付け足すことで解決できるらしい. 解説を見たら確かにそうだとわかるんですけどね・・・. 本番で思いついて実装できるかって言われたら・・・,って感じです. DPをほとんど実装したことがないので,圧倒的経験値不足です. 精進します・・・.
F:Making Palindrome
まだ解説すら見ていません. Dijkstra法とかで解決できるみたいなので,時間あれば見てみます.
今後の目標
とりあえず年内緑を目指して頑張ろうと思います. しばらくサボってた間のABCの問題を解いて,力をつけていきます.







