zoukankan      html  css  js  c++  java
  • 4、有趣的排序--百度2017春招

    [编程题] 有趣的排序
    时间限制:1秒
    空间限制:32768K
    度度熊有一个N个数的数组,他想将数组从大到小排好序,但是萌萌的度度熊只会下面这个操作:
    任取数组中的一个数然后将它放置在数组的最后一个位置。
    问最少操作多少次可以使得数组从小到大有序? 
    输入描述:
    首先输入一个正整数N,接下来的一行输入N个整数。(N <= 50, 每个数的绝对值小于等于1000)
     
     
    输出描述:
    输出一个整数表示最少的操作次数。
     
    输入例子:
    4 19 7 8 25
     
    输出例子:
    2
     
    解题思路:这是一道贪心问题
    对于数组中的第i个元素,如果它后面有比它小的元素,这就说明第i个元素理应被移动到末尾去。
    另外,应该优先移动较小的元素,这样才能够保证较小元素最后排在最前面。
    实际上,这个问题没这么复杂。
    用一个备份数组b,把a中元素放到b中,对b数组进行排序。从第一个排好序的元素开始,即最小的元素开始与没排好序数组元素比较,检查有多少个已经是从小到大排好序的,位置可以不连续,但是大的元素必须在小的元素后面,统计出一共有 count个,这些元素是不需要移动的元素,一共有 n 个元素,所以需要移动 n - count 次
     
     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int n;
     8     while(cin>>n)
     9     {
    10         int count = 0;
    11         int a[n];
    12         int b[n];
    13         for(int i = 0;i<n;i++)
    14         {
    15             cin>>a[i];
    16             b[i] = a[i];
    17         }
    18         sort(b,b+n);
    19         int j = 0;
    20         for(int i=0;i<n;i++)
    21         {
    22             if(a[i] == b[j])
    23             {
    24                 count++;
    25                 j++;
    26             }
    27             if(j == n)
    28                 break;
    29         }
    30         cout<<n-count<<endl;
    31     }
    32     return 0;
    33 }
  • 相关阅读:
    PAT1124:Raffle for Weibo Followers
    Pat1071: Speech Patterns
    PAT1032: Sharing (25)
    Pat1128:N Queens Puzzle
    C++相关:C++的IO库
    Pat1108: Finding Average
    PAT1070:Mooncake
    乐港游戏校招面试总结
    并发编程005 --- future &&futureTask
    并发编程004 --- 线程池的使用
  • 原文地址:https://www.cnblogs.com/qqky/p/6897619.html
Copyright © 2011-2022 走看看