競技プログラミング,PCK2014の予選5門目についてです。
AOJ0299/PCK14予選5問目
上記がその問題です。
そして下記に示すのが先ほどまでに書いた、私のC++を使用した、プログラムです。
いくつかの反例に気づき、デバッグ作業をしましたが、オンラインジャッジサイトAOJでは、部分点しかもらえません。
なぜACしないのかが自分の頭では思いつかなかったので、皆様にお力添えをいただく、質問をしている次第です。
反例が分かりましたら、コメントの方よろしくお願いします。
※尚、下記のソースは確認用の出力が関数内に多くに存在します。お見苦しい限りですが、初心者ですので暖かい目での閲覧の方よろしくお願いします。
lang
1#include <iostream> 2#include <algorithm> 3#include <stdlib.h> 4#include <cstdio> 5#include <map> 6#define X 1111111 7#define F first 8#define S second 9using namespace std; 10typedef pair <int,pair<int,int> > P; 11void near(void); 12void unclock(void); 13int ans=0; 14int n,m,p;//左から、駅の数、目的地の数、出発駅 15int a[111111];//目的地の配列 16int x[111111];//今入る地点から反時計回りでのその目的地へ到達するための距離 17int kakutei[111111];//まわり方で早い方の目的地につくまでの小さい奴が入ってる 18int cnt=0; 19int d[111111]={0};//フラグ的な意 20int main(){ 21 cin >> n >> m >> p; 22 for(int i=0;i<m;i++){ 23 cin >> a[i]; 24 } 25 for(int i=0;i<m;i++){ 26 /*どこの目的地が今入るところから一番近いか*/ 27 unclock(); 28 29 //1-2.目的地につくまでの経路として時計回りか反時計回りどちらが近いか 30 near(); 31 } 32 /*for(int i=0;i<n;i++){ 33 cout << d[i] << endl; 34 }*/ 35 cout << ans << endl; 36} 37 38//1-1反時計回りの場合 39void unclock(void){ 40 int test;//目的地コピー用 41 for(int i=0;i<m;i++){ 42 if(d[i]==1)continue; 43 test=a[i]; 44 cnt=0; 45 //cout << test << endl; 46 for(;;){ 47 //cout << test << endl; 48 if(test==p){ 49 x[i]=cnt; 50 //cout << x[i] << endl; 51 break; 52 } 53 test--; 54 cnt++; 55 if(test==-1){ 56 test=n-1; 57 } 58 } 59 } 60 return; 61} 62 63void near(void){ 64 int test;//目的地コピー用 65 P pa[1111]; 66 for(int i=0;i<m;i++){ 67 pa[i]=(make_pair(X, make_pair(X, X) ) ); 68 } 69 int k=0; 70 for(int i=0;i<m;i++){ 71 int check=0; 72 if(d[i]==1)continue; 73 test=a[i]; 74 for(;;){//時計回りでの距離 75 test++; 76 check++; 77 if(test==n)test=0; 78 if(test==p)break; 79 } 80 //cout << endl; 81 //cout << check << " " << x[i] << endl; 82 //check=abs(a[i]-p); 83 //cout << a[i] << " " << p << endl; 84 kakutei[i]=min(x[i],check); 85 pa[k]=(make_pair(kakutei[i], make_pair(a[i], i) ) ); 86 k++; 87 // cout << endl << kakutei[i] << endl; 88 } 89 //cout <<endl<< k << endl; 90 //cout << "そこまでの最短距離"<<pa[0].F << " そこの駅番号" << pa[0].S.F << " そこの番地" << pa[0].S.S << " 今いる場所" <<p << endl; 91 sort(pa,pa+m);//昇順にソート 92 ans+=pa[0].F*100;//値段に換算 93 p=pa[0].S.F; 94 d[pa[0].S.S]=1;//フラグを立てておく(既にいったを表す) 95 //cout << "そこまでの最短距離"<<pa[0].F << " そこの駅番号" << pa[0].S.F << " そこの番地" << pa[0].S.S << " 今いる場所" <<p << endl; 96 return; 97} 98 99 100 101
回答1件
あなたの回答
tips
プレビュー