题目1398:移动次数
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1331
解决:346
题目描述:
众所周知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)
思路:题不难,只是处理重复的最大值和最小值有点小技巧
AC代码:
#include<stdio.h> #include<string.h> #include<limits.h> int a[300]; int main() { int i,j,n,max,min,maxnum,minnum,t,sum; while(scanf("%d",&n)!=EOF) { maxnum=INT_MIN;minnum=INT_MAX; for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) { if(a[i]>=maxnum) {max=i;maxnum=a[i];} if(a[i]<minnum) {min=i;minnum=a[i];} } sum=0; if(n-1-max<=min) { for(i=max;i<n-1;i++) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; sum++; } for(i=0;i<n;i++) { if(a[i]==minnum) {min=i;minnum=a[i];break;}//注意,这里加break的原因就是如果有两个以上相同的最小值,则选择最靠左的 } for(i=min;i>0;i--) { t=a[i]; a[i]=a[i-1]; a[i-1]=t; sum++; } printf("%d\n",sum); } else { for(i=min;i>0;i--) { t=a[i]; a[i]=a[i-1]; a[i-1]=t; sum++; } for(i=0;i<n;i++) { if(a[i]==maxnum) {max=i;maxnum=a[i];}//注意,这里不加break的原因就是如果有两个以上相同的最大值,则选择最靠右的 } for(i=max;i<n-1;i++) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; sum++; } printf("%d\n",sum); } } return 0; }
时间: 2024-12-31 01:13:30