[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;
}
posted @ 2020-07-30 22:14  gdgzliu  阅读(112)  评论(0编辑  收藏  举报