欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

陕西师范大学第七届程序设计竞赛I题——排队

程序员文章站 2024-03-25 22:54:58
...
 ACM竞赛队内要开运动会啦!!!!        竞赛队内的一群阳光乐观积极的队员们迅速的在操场上站成了一支队伍准备开始热身运动。但教练看了一眼觉得队伍高高低低很不整齐。    教练想让大家从低到高站好,每次教练可以任选择一个人令他走到队首,教练想知道他要最少要进行几次这样的操作才能把队伍按从低到高排整齐(身高最低的人站在队首)。
输入描述:
第一行输入N(N<=1000)代表一共有N个队员第二行输入N个数表示初始时的队伍所对应的每个人的身高(100<=身高<=300)(第一个输入的是队首,最后一个输入的是队尾)
输出描述:
输出教练所需要的最小操作步数
示例1
输入
2
183 185
输出
0
示例2
输入
3
173 186 166
输出
1

思路:最大次数即为人数,可以想到最高后若有更矮(比第二高的矮)就必须移动,以此类推即存在一个递减子序列且该子序列必须与排序后大小吻合,它的长度即为可减少的操作次数。(比赛时紧张起来,部分逻辑题是真的理不清,需加强心理训练)。
代码如下:
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#define maxn 1050
using namespace std;
typedef long long ll;
int n,a[maxn],b[maxn];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%d",&a[i]),b[i]=a[i];
    sort(b,b+n+1);
    int num=n;
    for(int i=n;i>=1;i--)
    {
        if(a[i]==b[num])
            num--;//若存在从最大开始的递减子序列,就不用移动他们,即最大步数减一。 
    }
    printf("%d\n",num);
    return 0;
}

相关标签: 逻辑