1046. Shortest Distance (20)
题目:
The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed to tell the shortest distance between any pair of exits.
输入格式:
Each input file contains one test case. For each case, the first line contains an integer N (in [3, 10^5]), followed by N integer distances D1 D2 … DN, where Di is the distance between the i-th and the (i+1)-st exits, and DN is between the N-th and the 1st exits. All the numbers in a line are separated by a space. The second line gives a positive integer M (<=10^4), with M lines follow, each contains a pair of exit numbers, provided that the exits are numbered from 1 to N. It is guaranteed that the total round trip distance is no more than 10^7.
输出格式:
For each test case, print your results in M lines, each contains the shortest distance between the corresponding given pair of exits.
输入样例:
5 1 2 4 14 9
3
1 3
2 5
4 1
输出样例:
3
10
7
思路:
*1.用dist[i]来存1号点到i号点顺时针方向下一个点的的距离,sum存储一 圈的总长度。注意要在输入的时候直接累加sum并赋值给dist[i]
*2.first和second分别记录要求的两个点标号(保证second > first,不然就swap)
求出顺时针和逆时针的弧长,进行比较,得出小的那一个
clockwise = dist[second - 1] - dist[first - 1];
//得到顺时针的距离
printf("%d\n", min(clockwise, sum - clockwise));
//用总距离-顺时针距离得到逆时针距离
//选顺时针和逆时针距离中小的那一个
代码:
/**
* @tag PAT_A_1046
* @authors R11happy (xushuai100@126.com)
* @date 2016-07-20 20:30:16-21:04
* @version 1.0
* @Language C++
* @Ranking 40/6605
*/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm> //要用到swap和min函数
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 5; //100000另一种表达 1e5
int dist[MAXN]; //dist[i]存放第1号节点,顺时针到达第i号节点下一节点的距离
int main()
{
ll N, M, sum = 0;
ll clockwise = 0; //记录顺时针的距离
int temp, first, second;
scanf("%lld", &N); //注意long long 一定要用%lld,不然会直接跳出
for (int i = 1; i <= N; i++)
{
scanf("%d", &temp);
sum += temp;
dist[i] = sum; //输入的时候就记录1节点到每个节点的距离
}
int T;
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &first, &second);
if (first > second)
{
swap(first, second);
}
clockwise = dist[second - 1] - dist[first - 1]; //得到顺时针的距离
printf("%d\n", min(clockwise, sum - clockwise)); //用总距离-顺时针距离得到逆时针距离
//选顺时针和逆时针距离中小的那一个
}
return 0;
}
收获:
1.#include <algorithm>
头文件自带min()和swap()函数
2. 用1e5表示100000
3. 求逆时针的弧长用总弧长-顺时针弧长即可,要记录1号到i号之间的顺时针弧长
4. 输入的时候要对dist[]和sum进行预处理,不然容易超时