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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值