AOJの問題について
Posted: 2015年2月13日(金) 11:57
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;
}
この問題で、どうしても正解が出せません。
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;
}