HDU 5500 Reorder the Books 思维分析题

本文介绍了一种针对特定整数序列的操作优化方法,通过分析序列特性,仅需线性时间复杂度即可确定最少操作次数,实现序列的有效调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一开始以为是一道搜索题,因为n只有19,所以就算时间复杂度很高的搜索应该也可以。感觉搜索还是可以做出来,但是那肯定是饶了N个圈了。

分析可以发现:

1.最大的数n是不用操作的。

2. 每个数只操作一次,否则没有意义。

于是我们先找到最大的数"n"的位置,从这个位置往前找,直到找到(n−1)。假如找到头也没找到(n−1),那么数"(n−1)"需要操作,而一旦操作了"(n−1)",不难想到,前(n−1)个数都要进行操作;假如找到了(n-1),那么数"(n-1)"也不需要操作。 同理,我们接着从(n−1)的位置往前找(n−2),再从(n−2)的位置往前找(n−3)...假如数k找不到了,那么就至少需要k次操作。这种做法的复杂度是O(n)的。

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    int T,n,a[22],k,j;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]==n)
                k=i;
        }
        
        for( j=k;j>=1;j--)
            if(a[j]==n )
                n--;
                
        printf("%d\n",n);
    }
    return 0;
}<strong>
</strong>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值