A1046

    技术2026-02-21  16

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

     

    Processed: 0.039, SQL: 9