0%

PAT A1046 Shortest Distance

我的解法

解题思路:直接循环加起来求和,顺时针求1-3和3-1两部分的和,然后比较!暴力求解,最后一个测试用例超时,只得了17分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <cstdio>
const int N=100010;
const int M=10010;
int D[N],n,m,x,y;
struct Node{
int x,y;
};
Node exits[M];
int getDist(int start,int end){
int sum=0,i=start;
while(i<=n){
// printf("%d %d\n",i,end);
sum+=D[i];
i++;
if(i>n){
i=i%n;
}
if(i==end) break;
}

return sum;
}

int main(){

scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&D[i]);
}
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d %d",&x,&y);
exits[i].x=x;
exits[i].y=y;
}
// printf("----\n");
for(int i=0;i<m;i++){
// printf("%d %d\n",exits[i].x,exits[i].y);
int a=getDist(exits[i].x,exits[i].y);
int b=getDist(exits[i].y,exits[i].x);
printf("%d\n",(a<b?a:b));
}
return 0;
}

算法笔记解法

解题思路:将位置1到后面每一个节点的距离和保存到一个数组,然后dis(left,right)=最右边的值到1的距离减去最左边的值到1的距离,最后将结果和用总和sum减去该结果,也就是逆循环的结果进行比较,得出最终结果!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstdio>
const int N=100010;
const int M=10010;
int n,m,sum=0,D[N],dis[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&D[i]);
sum+=D[i];
dis[i+1]=sum;//记录位置1到某节点距离
}
scanf("%d",&m);
int left,right,temp;
for(int i=0;i<m;i++){
scanf("%d%d",&left,&right);
if(left>right) temp=dis[left]-dis[right];
else temp=dis[right]-dis[left];
printf("%d\n",temp<(sum-temp)?temp:(sum-temp));
}
return 0;
}

本文标题:PAT A1046 Shortest Distance

文章作者:GavinYGM

发布时间:2020年08月20日 - 22:08

最后更新:2020年08月20日 - 23:08

原始链接:http://www.gavinygm.cn/2020/08/20/PAT-A1046-Shortest-Distance/

许可协议: 转载请保留原文链接及作者。