1. 程式人生 > 實用技巧 >[CF從零單排#21]339B - Xenia and Ringroad

[CF從零單排#21]339B - Xenia and Ringroad

題目來源:http://codeforces.com/problemset/problem/339/B

Xenia lives in a city that has n houses built along the main ringroad. The ringroad houses are numbered 1 through n in the clockwise order. The ringroad traffic is one way and also is clockwise.

Xenia has recently moved into the ringroad house number 1. As a result, she's got m things to do. In order to complete the i-th task, she needs to be in the house number a i and complete all tasks with numbers less than i. Initially, Xenia is in the house number 1, find the minimum time she needs to complete all her tasks if moving from a house to a neighboring one along the ringroad takes one unit of time.

Input
The first line contains two integers n and m (2 ≤ n ≤ 105, 1 ≤ m ≤ 105). The second line contains m integers a 1, a 2, ..., a m (1 ≤ a i ≤ n). Note that Xenia can have multiple consecutive tasks in one house.

Output
Print a single integer — the time Xenia needs to complete all tasks.

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.

Examples
input
4 3
3 2 3
output
6
inputCopy
4 3
2 3 3
output
2
Note
In the first test example the sequence of Xenia's moves along the ringroad looks as follows: 1 → 2 → 3 → 4 → 1 → 2 → 3. This is optimal sequence. So, she needs 6 time units.

題目大意:

有N個房子,有M次任務。每次任務是一個整數i(1~N),意思就是要去到第i個房子。房子可以看成是一個環路,一開始在1號房子,且只能順時針走,每走一個房子用的時間是1,問這M個任務之後,最少用時多少?其中2<=n<=10^5, 1<=m<=10^5.

題目分析:

實際上就是對環進行處理,可以不用開陣列,只需要知道上次的位置a,和本次的位置b,就可以求到a到b需要的時間。有兩種情況,b>=a時,說明可以順時針走下去,需要時間是b-a;如果b<a,也就是要走過一圈,回頭才到,那麼需要的時間就是b+n-a。將這m次操作的時間累加起來就可以了。

參考程式碼:

#include <bits/stdc++.h>
using namespace std;
int main(){
	int n, m, a, b;
	long long ans = 0;
	cin >> n >> m;
	a = 1;
	for(int i=1; i<=m; i++){
		cin >> b;
		if(b>=a)
			ans += b-a;
		else
			ans += b+n-a;
		a = b;  // 當前位置變成了下一次的前一個位置
	}
	cout << ans;
	return 0;
}