ref:
http://tech-wonderland.net/blog/pat-1046-shortest-distance.html
提示整个路线是个圆,我的做法是针对每次输入,临时计算,结果有1个case 超时:
#include <stdio.h>
int n,m;
int d[100000+5];
int main(){
freopen("in.txt","r",stdin);
scanf("%d",&n);
int cycLen = 0;
for(int i = 1; i <= n; i++){
scanf("%d", &d[i]);
cycLen += d[i];
}
//这特码的是一个fucking圆, 从A到B的距离长度有两种:A->B, cycLen-(A->B)
scanf("%d",&m);
int d1, d2 = 0;
int s,e;
for(int i = 0; i < m; i++){
scanf("%d%d",&s,&e);
d1 = 0;
if(s < e){
for(int j = s; j < e; j++){
d1 += d[j];
}
}else{
for(int j = e; j < s; j++){
d1 += d[j];
}
}
d2 = cycLen - d1;
printf("%d\n", d1 > d2 ? d2 : d1);
}
return 0;
}
然后还是采用了ref的方法
#include <stdio.h>
#include <math.h>
int n,m;
int dFromFirst[100000+5];
int main(){
freopen("in.txt","r",stdin);
scanf("%d",&n);
int cycLen = 0;//圆的周长
for(int i = 1; i <= n; i++){
int tmp;
scanf("%d", &tmp);
dFromFirst[i] =cycLen;
cycLen += tmp;
//test
//printf("i = %d dfrom= %d\n",i,dFromFirst[i]);
}
scanf("%d",&m);
int d1, d2 = 0;
int s,e;
for(int i = 0; i < m; i++){
scanf("%d%d",&s,&e);
d1 = dFromFirst[e] - dFromFirst[s];//输入的s可能大于e, 编译器不支持abs,fuck!
d1 = d1 < 0 ? (0-d1) : d1;
d2 = cycLen - d1;
printf("%d\n", d1 > d2 ? d2 : d1);
}
return 0;
}