- 题目描述:
-
众所周知JOBDU旗下的JOBBALA公司是一家以个性、亲民著称的IT公司。在JOBBALA公司成立50周年的日子里,公司CEO组织全体员工登山旅游。按照往常的习惯,导游通常要求游客按照身高从低到高的顺序排好,但是考虑这次JOBBALA人数太多,排序很耗时间。因此,导游想了想,要求JOBBALA的员工可以随便排,但是必须保证队列的第一个是队列中最矮的,队列的最后一个是队列中最高的。例如:队列 { 1, 4, 3, 2, 2, 5} 就是符合的队列,{1, 4, 2, 3, 2, 5}也符合,而{2, 1, 2, 3, 4, 5}就是错的。请问对于任意的队列,最少要两两交换多少次,可以让其符合导游的要求?
- 输入:
-
输入有多组测试案例,每个测试案例为2行。
第一行包括一个整数n(2<=n<=200)表示人数,接下来一行包括n个整数a1, a2, …… an (1<=ai<=200) 表示n个员工初始的排列。
- 输出:
-
对应每个测试案例,按照导游的要求,输出最少需要两两交换的次数。
- 样例输入:
-
2 89 88 4 55 88 1 2
- 样例输出:
-
1 3
- 提示:
-
案例2中,最少需要移动三次:(55 88 1 2) -> (55 1 88 2) -> (1 55 88 2) -> (1 55 2 88)
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <string> 5 #include <algorithm> 6 7 8 int main(int argc, char const *argv[]) 9 { 10 int n; 11 while(scanf("%d",&n) != EOF) { 12 int min, max; 13 scanf("%d",&min); 14 max = min; 15 int mini = 0, maxi = 0; 16 int temp; 17 for(int i = 1; i < n; i++) { 18 scanf("%d",&temp); 19 if(min > temp) { 20 min = temp; 21 mini = i; 22 } 23 if(max <= temp) { 24 max = temp; 25 maxi = i; 26 } 27 } 28 int ans; 29 if(mini < maxi) { 30 ans = mini + n - 1 - maxi; 31 } 32 else if(mini > maxi) { 33 ans = mini + n - 1 - (maxi + 1); 34 } 35 printf("%d ", ans); 36 } 37 return 0; 38 }