一开始以为是一道搜索题,因为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>