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

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

ただいまの
回答率

90.61%

  • C++

    3339questions

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

  • プログラミング言語

    669questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

  • デバッグ

    95questions

    デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

競技プログラミング 反例(デバッグ)

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 709

van-0215

score 51

競技プログラミング,PCK2014の予選5門目についてです。
AOJ0299/PCK14予選5問目
上記がその問題です。
そして下記に示すのが先ほどまでに書いた、私のC++を使用した、プログラムです。
いくつかの反例に気づき、デバッグ作業をしましたが、オンラインジャッジサイトAOJでは、部分点しかもらえません。
なぜACしないのかが自分の頭では思いつかなかったので、皆様にお力添えをいただく、質問をしている次第です。
反例が分かりましたら、コメントの方よろしくお願いします。

※尚、下記のソースは確認用の出力が関数内に多くに存在します。お見苦しい限りですが、初心者ですので暖かい目での閲覧の方よろしくお願いします。

#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <cstdio>
#include <map>
#define X 1111111
#define F first
#define S second
using namespace std;
typedef pair <int,pair<int,int> > P;
void near(void);
void unclock(void);
int ans=0;
int n,m,p;//左から、駅の数、目的地の数、出発駅
int a[111111];//目的地の配列
int x[111111];//今入る地点から反時計回りでのその目的地へ到達するための距離
int kakutei[111111];//まわり方で早い方の目的地につくまでの小さい奴が入ってる
int cnt=0;
int d[111111]={0};//フラグ的な意
int main(){
  cin >> n >> m >> p;
  for(int i=0;i<m;i++){
    cin >> a[i];
  }
  for(int i=0;i<m;i++){
    /*どこの目的地が今入るところから一番近いか*/
    unclock();

    //1-2.目的地につくまでの経路として時計回りか反時計回りどちらが近いか
    near();
  }
  /*for(int i=0;i<n;i++){
    cout << d[i] << endl;
    }*/
  cout << ans << endl;
}

//1-1反時計回りの場合
void unclock(void){
  int test;//目的地コピー用
  for(int i=0;i<m;i++){
    if(d[i]==1)continue;
    test=a[i];
    cnt=0;
    //cout << test << endl;
    for(;;){
      //cout << test << endl;
      if(test==p){
    x[i]=cnt;
    //cout << x[i] << endl;
    break;
      }
      test--;
      cnt++;
      if(test==-1){
    test=n-1;
      }
    }
  }
  return;
}

void near(void){
  int test;//目的地コピー用
  P pa[1111];
  for(int i=0;i<m;i++){
    pa[i]=(make_pair(X, make_pair(X, X) ) );
  }
  int k=0;
  for(int i=0;i<m;i++){
    int check=0;
    if(d[i]==1)continue;
    test=a[i];
    for(;;){//時計回りでの距離
      test++;
      check++;
      if(test==n)test=0;
      if(test==p)break;
    }
    //cout << endl;
    //cout << check << " " << x[i] << endl;
    //check=abs(a[i]-p);
    //cout << a[i] << " " << p << endl;
    kakutei[i]=min(x[i],check);
    pa[k]=(make_pair(kakutei[i], make_pair(a[i], i) ) );
    k++;
    // cout << endl << kakutei[i] << endl;
  }
  //cout <<endl<< k << endl;
  //cout << "そこまでの最短距離"<<pa[0].F << " そこの駅番号" << pa[0].S.F << " そこの番地" << pa[0].S.S << " 今いる場所" <<p << endl;
  sort(pa,pa+m);//昇順にソート
  ans+=pa[0].F*100;//値段に換算
  p=pa[0].S.F;
  d[pa[0].S.S]=1;//フラグを立てておく(既にいったを表す)
  //cout << "そこまでの最短距離"<<pa[0].F << " そこの駅番号" << pa[0].S.F << " そこの番地" << pa[0].S.S << " 今いる場所" <<p << endl;
  return;
}


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2015/05/31 00:05

    「いくつかの反例に気づき、デバッグ作業をしましたが」←内容が全く書かれてませんがどういうことですか?

    キャンセル

  • van-0215

    2015/05/31 05:58

    ozwkさん、ありがとうございます。 「いくつかの反例に気づき、デバッグ作業をしましたが」というのは、既に動作が完了しているため、書かなくてもいいかなと自己判断をしました。(0番目の駅を越えると値がおかしくなるなど)  回答の方ですが、現在記入したプログラム内でおかしなとこや反例があったら、そちらを教えていただきたいと思います。

    キャンセル

回答 1

checkベストアンサー

+1

100 4 0
2
10
95
99
こんなんいかがでしょう。
ご提示のコードを手前の環境で実行したところ 2600 と出ましたが、
正解はおそらく 2000 だと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/31 18:50

    回答の方ありがとうございます。
    申し訳ございません、そちらのサンプル要素が1つ足りないのですが、いかがでしょうか?

    キャンセル

  • 2015/05/31 19:26

    失礼しました。
    間違っておりました。
    100 4 0
    2
    10
    95
    99
    です。

    キャンセル

  • 2015/06/02 20:42

    遅くなってしまい、申し訳ございませんでした。 おかげさまで理解することができました。ありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    C++ Queue

    すみません、ひとつプログラムについて質問がありまして、質問させていただいています。 本日C++で(PriorityQueue)を使った問題をといていたのですが、あるソースプログラム

  • 解決済

    二次元配列の入出力

    度々すいません。二次元配列入出力についての質問です。 n(任意)人の身長と体重をキーボードから読み込み、2次元配列に蓄えたうえで、その内容を入力順に出力するプログラムを作りたいので

  • 解決済

    型変換のエラー

      while (cnt = fin.read(inbuf, BUF_SIZE))  の部分ですが、  invalid conversion from ‘void*’ to ‘in

  • 解決済

    出入力c++

    入出力のコードを書いていたのですが、エラーがでてしまいます。 問題点を指摘してくださるとうれしいです。 コード /*  * stream.cpp  *  *  Created on

  • 解決済

    標準入力からの入力方法について

    以下のような行数の決まっていない数値を1つずつ標準入力から取得し(取得した数値はあとで利用したいので 全部まとめて配列などに入れて保持したい)ですが分かりませんでした。 1

  • 解決済

    AOJ ITP1_3_C の問題がうまくいきません。

    AOJ(会津オンラインジャッジ)を最近始めて勉強しています。 ITP1_3_C 二つの数の交換  の問題でうまくいきません。 入力は3000行以内で、整数x,yを用いて

  • 解決済

    「素数の足し算で」の解き方を教えてください

     はじめに いつもお世話になっております。 件名の解き方についてアドバイスを下さい。 これはCodeIQに投稿されていた問題だったのですが、どうしても解けませんでした。

  • 解決済

    配列の要素間の和を全パターン求めるプログラムを作成したい。

    皆様ありがとうございました。 前提・実現したいこと <CもしくはC++> 配列の要素間の和を全パターン求めるプログラムを作成したい。 【例】 /*-------------

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

  • C++

    3339questions

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

  • プログラミング言語

    669questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

  • デバッグ

    95questions

    デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。