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; }