九度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;
}
相关文章
|
4月前
最小操作次数问题
最小操作次数问题
38 1
|
10月前
|
算法
面试题:如何找出数组里出现次数超过总数1/3的数
如果你每次从nums中拿出3个不一样的数作为一组,肯定会出现两种情况。一,nums被取空了,那么nums中每个数出现次数最多占总次数的1/3,写代码很好处理吧!! 二,还有剩余,这个情况就复杂了,有可能剩余多个,但是……但是,最多只可能剩余两种数。 为什么? 3个不同的数凑一组才能删掉,所以不可能删掉超过1/3的数。所以超过1/3的数肯定被剩下来,但是,剩下来的俩数并不一定都是超过1/3的,这点额外注意。
59 1
|
4月前
933.最近的请求次数
933.最近的请求次数
35 0
|
4月前
|
算法 测试技术 C++
【大根堆】【C++算法】871 最低加油次数
【大根堆】【C++算法】871 最低加油次数
|
4月前
|
存储 Python
判断一个字符串中出现次数最多的字符,统计这个次数?
判断一个字符串中出现次数最多的字符,统计这个次数?
64 0
|
4月前
leetcode-871:最低加油次数
leetcode-871:最低加油次数
24 0
|
10月前
|
JavaScript 前端开发
判断一个字符串中出现次数最多的字符,统计这个次数
判断一个字符串中出现次数最多的字符,统计这个次数
67 0
判断一个字符串中出现次数最多的字符 统计这个次数
判断一个字符串中出现次数最多的字符 统计这个次数
1186:出现次数超过一半的数
1186:出现次数超过一半的数
随机1-100的数循环找出88的次数
随机1-100的数循环找出88的次数
78 0