超时代码:
#include<cstdio>
#include<cstdlib>
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int N,M,a,b,D[100002];
D[0]=0; //缓冲效果,当计算1到某个值之间距离时有用
scanf("%d",&N);
for(int i=1;i<=N;i++){
scanf("%d",&D[i]);
}
scanf("%d",&M);
for(int i=1;i<=M;i++){
scanf("%d%d",&a,&b);
int min,max,sum1=0,sum2=0;
if(a>=b){
max=a,min=b;
}else{
max=b,min=a;
}
for(int j=min;j<max;j++){ //顺着走
sum1+=D[j];
}
for(int k=0;k<=min-1;k++){ //逆着走
sum2+=D[k];
}
for(int k=max;k<=N;k++){
sum2+=D[k];
}
if(sum1<sum2){
printf("%d\n",sum1);
}else{
printf("%d\n",sum2);
}
}
return 0;
}
优化后,不过还是超时:
#include<cstdio>
#include<cstdlib>
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int N,M,a,b,D[100002],sum=0;
D[0]=0; //缓冲效果,当计算1到某个值之间距离时有用
scanf("%d",&N);
for(int i=1;i<=N;i++){
scanf("%d",&D[i]);
sum+=D[i]; //算出距离总和
}
scanf("%d",&M);
for(int i=1;i<=M;i++){
scanf("%d%d",&a,&b);
int min,max,sum1=0,sum2;
if(a>=b){
max=a,min=b;
}else{
max=b,min=a;
}
for(int j=min;j<max;j++){ //顺着走
sum1+=D[j];
}
sum2=sum-sum1; //逆着走
if(sum1<sum2){
printf("%d\n",sum1);
}else{
printf("%d\n",sum2);
}
}
return 0;
}
优化终成正果:
有一点动态规划思想,dis数组存储过程,都在之前得到的数的基础之上,添加新输入的数,从而获取当前所要的数。
#include<cstdio>
#include<cstdlib>
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int N,M,a,b,D[100002],dis[100002]; //dis数组用于存储第一个点到其他所有点之间的距离:dis[2]=D[1]+D[2].
D[0]=0; //缓冲效果,当计算1到某个值之间距离时有用
scanf("%d",&N);
dis[0]=0;
for(int i=1;i<=N;i++){
scanf("%d",&D[i]);
dis[i]=dis[i-1]+D[i];
}
scanf("%d",&M);
for(int i=1;i<=M;i++){
scanf("%d%d",&a,&b);
int min,max,sum1,sum2;
if(a>=b){
max=a,min=b;
}else{
max=b,min=a;
}
sum1=dis[max-1]-dis[min-1]; //顺着走
sum2=dis[N]-dis[max-1]+dis[min-1]; //逆着走
if(sum1<sum2){
printf("%d\n",sum1);
}else{
printf("%d\n",sum2);
}
}
return 0;
}