質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

abc255 B問題でmapを使用した場合の挙動

kyokio
kyokio

総合スコア473

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

2回答

0評価

0クリップ

271閲覧

投稿2022/06/11 16:25

ABC255 B問題

AtCoderで本日行われたABC255のB問題について質問です。
自分の回答のエラーになる箇所を探していましたがわからなかったため解説をみました。

実現したいこと

解説と自分の回答の方針は同じで、下記箇所のみが違いました。

  1. 解説では明かりを持っている人をvectorで持たせていましたが私はmapを使用した点でした。
  2. 一番近い明かりを持つ人をさがすループ(i=0...n)でi番目の人が明かりを持つ場合一番近い明かりを持つ人は自分になるため明かりを持つ人のループをcontinueする。(実際は意味がない)

発生している問題・エラーメッセージ

mapを使用しても上記の2を考慮しない下記コード(デバッグのため終了後解説のコードを元に作成)では回答が得られました。

c++

#include<bits/stdc++.h> using namespace std; int main(){ int n,k; cin >> n >> k; map<int,int> mp; for(int i=0;i<k;i++){ int nx; cin >> nx; nx--; mp[nx]++; } vector<long long> x(n),y(n); for(int i=0;i<n;i++){cin >> x[i] >> y[i];} long long res=0; for(int i=0;i<n;i++){ long long cres=8e18; for(auto nt: mp){ int nx=nt.first; cres=min(cres,(x[i]-x[nx])*(x[i]-x[nx]) + (y[i]-y[nx])*(y[i]-y[nx])); } } printf("%.12lf\n",sqrt((double)res)); return 0; }

しかし、上記の2を考慮した下記コードにすると正しい回答が得られなくなります。

c++

#include<bits/stdc++.h> using namespace std; int main(){ int n,k; cin >> n >> k; map<int,int> mp; for(int i=0;i<k;i++){ int nx; cin >> nx; nx--; mp[nx]++; } vector<long long> x(n),y(n); for(int i=0;i<n;i++){cin >> x[i] >> y[i];} long long res=0; for(int i=0;i<n;i++){ long long cres=8e18; if(mp[i]>0)continue; // 追加 for(auto nt: mp){ int nx=nt.first; cres=min(cres,(x[i]-x[nx])*(x[i]-x[nx]) + (y[i]-y[nx])*(y[i]-y[nx])); } } printf("%.12lf\n",sqrt((double)res)); return 0; }

試したこと

n回のループでi番目の人が明かりを持つ場合に一番近くの明かりを持つ人との距離が0になっている確認するためのcout、
continueをしたこと仮定するcoutを追記した下記コードを試してみました。

c++

#include<bits/stdc++.h> using namespace std; int main(){ int n,k; cin >> n >> k; map<int,int> mp; for(int i=0;i<k;i++){ int nx; cin >> nx; nx--; mp[nx]++; } vector<long long> x(n),y(n); for(int i=0;i<n;i++){cin >> x[i] >> y[i];} long long res=0; for(int i=0;i<n;i++){ long long cres=8e18; // debag if(mp[i]>0){ cout << i << ":continue" << endl; // continue; }else{ cout << i << ":not continue" << endl; } for(auto nt: mp){ int nx=nt.first; cres=min(cres,(x[i]-x[nx])*(x[i]-x[nx]) + (y[i]-y[nx])*(y[i]-y[nx])); } // debag if(cres==0)cout << cres << endl; else cout << cres << endl; res=max(res,cres); } printf("%.12lf\n",sqrt((double)res)); return 0; }

上記コードは実際にはcontinueしないため正常に動作するコードと同じ挙動になると思いましたが正しい回答を出力できませんでした。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。