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

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

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

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

受付中

ABC212-Cの解答の修正

削除済ユーザー
削除済ユーザー

総合スコア0

C++

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

1回答

0評価

0クリップ

418閲覧

投稿2021/08/08 09:19

前提・実現したいこと

Atcoderでc++を使って競技プログラミングを始めたものです(初心者なのでお恥ずかしながら茶よりの灰です...)
先日のABCのC問題で、ACにしたいのですがどうしてもそうならず分からなかったため質問させていただきます。別の解法ではACになるのでしょうが、できるだけこの解法がACになるように修正していただきたいです。もしこの解法自体に問題があってそれが出来なければ、それもお願いします。

###問題のリンク
https://atcoder.jp/contests/abc212/tasks/abc212_c

発生している問題

サンプル三つはACです。しかしそれ以外のテストケース20のうち12個がAC,8個はWAです。書いた時はTLEになるかもしれないと思いながら提出しましたが、そうではありませんでした。WAになる原因も謎ですが、TLEにならない理由も謎です。

該当のソースコード

C++

#include <bits/stdc++.h> using namespace std; int main(){ int a,b; cin >> a >> b; vector<int> A(a); vector<int> B(b); for(int i=0;i<a;i++){ cin >> A[i]; } for(int i=0;i<b;i++){ cin >> B[i]; } sort(A.begin(),A.end()); sort(B.begin(),B.end()); int mini=1000000001,itiji=0; for(int i=0;i<a;i++){ for(int j=0;j<b-1;j++){ if(abs(A[i]-B[j])<=abs(A[i]-B[j+1])){ itiji=abs(A[i]-B[j]); goto A; } if(j==b-2){ itiji=abs(A[i]-B[j+1]); } } A: ; mini=min(mini,itiji); if(mini==0){ break; } } cout << mini << endl; }

試したこと

同じく競技プログラミングをやられている方に質問し、b=1の時にitijiが更新されないのではないかとアドバイスをいただいたので以下のようにしてみましたが、何も変わりませんでした。

C++

#include <bits/stdc++.h> using namespace std; int main(){ int a,b; cin >> a >> b; vector<int> A(a); vector<int> B(b); for(int i=0;i<a;i++){ cin >> A[i]; } for(int i=0;i<b;i++){ cin >> B[i]; } sort(A.begin(),A.end()); sort(B.begin(),B.end()); int mini=1000000001,itiji=0; for(int i=0;i<a;i++){ //ここから追加 if(b==1){ itiji=abs(A[i]-B[0]); goto A; } //ここまで for(int j=0;j<b-1;j++){ if(abs(A[i]-B[j])<=abs(A[i]-B[j+1])){ itiji=abs(A[i]-B[j]); goto A; } if(j==b-2){ itiji=abs(A[i]-B[j+1]); } } A: ; mini=min(mini,itiji); if(mini==0){ break; } } cout << mini << endl; }

###Atcoder公式解説の正解コード
参考までにどうぞ。

C++

#include <bits/stdc++.h> using namespace std; #define N 200010 #define INF 1010000000 #define rep(i, n) for(int i = 0; i < n; ++i) int main(void) { int n, m; int a[N]; int b[N]; int ans = INF; cin >> n >> m; rep(i, n)cin >> a[i]; rep(i, m)cin >> b[i]; sort(a, a + n); sort(b, b + m); int x = 0; int y = 0; while ((x < n) && (y < m)) { ans = min(ans, abs(a[x] - b[y])); if (a[x] > b[y])y++; else x++; } cout << ans << endl; return 0; }

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

C++

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