1046 Shortest Distance (20 分)
题目大意
简单模拟。
基本思路
所有结点连起来会形成一个环形。dis[i]存储第1个结点到第i个结点的下一个结点的距离。sum保存整个路径一圈的总和值。求得结果就是dis[right – 1] – dis[left – 1]和 sum – dis[right – 1] – dis[left – 1]中较小的那一个。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,m;
int sum = 0;//环形的总长度
cin>>n;
vector<int> dis(n + 1);//dis[i]存储第1个结点到第i个结点的下一个结点的距离
//读入初始数据,给数组dis赋值并计算sum
for(int i = 1; i <= n; ++i) {
int temp;
cin>>temp;
sum += temp;
dis[i] = sum;
}
//读入测试样例,计算最短距离并输出结果
cin>>m;
for (int i = 0; i < m; ++i) {
int left,right;
cin>>left>>right;
if(left>right)
swap(left,right);
int temp = dis[right - 1] - dis[left - 1];
cout<<min(temp,sum-temp)<<endl;
}
}