Shortest Distance (20分)
单词:
corresponding:对应的
总结:
理解题中Di含义, 画出示意图。i,j两点间距离只有两种:①i →j ②j→i(→:顺时针),其中较小者为所求最短路径,且两者相加=一圈的总路程。
sum:总长度,
dis[i]:从1到i+1的长度,那么2中的①:dis[j-1]-dis[i-1] 2中的②:sum-①。(对于dis数组的定义可能不同,注意
下标表示的含义!) 必须对距离进行预处理,比如用dis 数组记录,否则在数据大的情况下会超时。实际上是一种空间换时间。
(空间增加数组存放每次查询的对应结果
时间每一次查询的时间
)
代码:
#include<stdio.h>
const int MAXN = 100001;
const int MAXM = 10001;
int d[MAXN] ,dis[MAXN] ;
int fin[MAXM];
int min(int a, int b){
if(a>b) return b;
else return a;
}
int main(){
int n;
scanf("%d", &n);
int total = 0;
for(int i=1; i<=n; i++){
scanf("%d", &d[i]);
total += d[i];
dis[i] = total; //1到i+1距离
/*语句顺序替换 dis[i]表示1到i距离:
dis[i] = total;
total += d[i];
*/
}
int m;
scanf("%d", &m);
int x1, x2, di;
for(int i=0; i<m; i++){
scanf("%d %d", &x1,&x2);
if(x1>x2){
di = dis[x1-1] - dis[x2-1];//画图分析x1到x2之间如何计算距离
//di = dis[x1] - dis[x2];
fin[i] = min(di, total-di);
}else{
di = dis[x2-1] - dis[x1-1];
//di = dis[x2] - dis[x1];
fin[i] = min(di, total-di);
}
}
for(int i=0; i<m-1; i++){
printf("%d\n", fin[i]);
}
printf("%d", fin[m-1]);
return 0;
}