http://judge.u-aizu.ac.jp/onlinejudge/d ... sp?id=0299
この問題で、どうしても正解が出せません。
http://web-ext.u-aizu.ac.jp/pc-concours ... 14_pre.pdf
の解説と、方針は間違っていないはずなのですが。どこが違うか教えていただけると嬉しいです。
int get(int a,int b,int n,bool f){
if(f){
if(a>b)return b+n-a;
else return b-a;
}
else{
if(a>b)return a-b;
else return a+n-b;
}
}
int main(){
int n,m,p,t[120000],ans=pow(2,30);
int a1=0,a2=0;
cin>>n>>m>>p;
for(int i=0;i<m;i++)cin>>t;
sort(t,t+m);
for(int i=0;i<m;i++){
a1=max(a1,get(p,t,n,1));
}
for(int i=0;i<m;i++){
a2=max(a2,get(p,t,n,0));
}
ans=min(a2,a1);
if(ans==0)ans=20*n;
for(int i=0;i<m-1;i++){//右回りにtまで行って,左回りにt[i+1]まで行く
ans=min(ans,get(p,t,n,1)*2+get(p,t[i+1],n,0));
}
for(int i=m-1;i>0;i--){//左回りにtまで行って、右回りにt[i-1]まで。
ans=min(ans,get(p,t,n,0)*2+get(p,t[i-1],n,1));
}
if(m==1)cout<<min(get(p,t[0],n,1),get(p,t[0],n,1))*100<<endl;
else cout<<ans*100<<endl;
return 0;
}
AOJの問題について
Re: AOJの問題について
コードはBBcodeを有効にした状態でcodeタグで囲み、かつ適切にインデントをしていただけると、見やすくて助かります。
まだどこが違っているのかはわかりませんが、先頭にを書いて実行すると、
という入力を入れた時、答えは100となるはずなのに、900が出力されました。
まだどこが違っているのかはわかりませんが、先頭に
#include <iostream>
#include <cmath>
#include <algorithm>
using std::cin;
using std::cout;
using std::endl;
using std::sort;
using std::max;
using std::min;
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: AOJの問題について
dfaddffafdadfa さんが書きました: for(int i=0;i<m-1;i++){//右回りにtまで行って,左回りにt[i+1]まで行く
ans=min(ans,get(p,t,n,1)*2+get(p,t[i+1],n,0));
}
for(int i=m-1;i>0;i--){//左回りにtまで行って、右回りにt[i-1]まで。
ans=min(ans,get(p,t,n,0)*2+get(p,t[i-1],n,1));
}
右回りにt[m-1]まで行って、左回りにt[0]まで行くケースが考慮されていません。
また、左回りにt[0]まで行って、右回りにt[m-1]まで行くケースが考慮されていません。
例えば という入力を入れた時、答えは300となるはずなのに、900と出力されました。
この部分での2回のgetの呼び出しについて、引数がどちらも同じになっています。dfaddffafdadfa さんが書きました: if(m==1)cout<<min(get(p,t[0],n,1),get(p,t[0],n,1))*100<<endl;
どちらか一方の第四引数は0になるべきだと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)