九度1398:移动次数

题目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;
}

你可能感兴趣的:(C++,C语言,ACM,OJ,九度题目1398移动次数)