hihocoder 1523 数组重排2 思维


题目链接


题意:

给定一个1-N的排列A1, A2, ... AN,每次操作小Hi可以选择一个数,把它放到数组的最左边。

请计算小Hi最少进行几次操作就能使得新数组是递增排列的。


思路:


这种题做过很多次了,就是换了个问法,本质都一样.可这次还是想了好久。。

这个题的话因为要求最小的操作数,而且要是严格递增的,由于每次只能放在最左边,所以我们想到逆着来做,从后往前,

从最大的开始,一定存在某个数只需要移动一次就可以.而且最多一共移动n次,如果当前的数满足递增序列的末尾,那么就

不需要移动,就把移动的次数-1,其他数来移动不会影响他的顺序.

#include<bits/stdc++.h>
#define Ri(a) scanf("%d", &a)
#define Rl(a) scanf("%lld", &a)
#define Rf(a) scanf("%lf", &a)
#define Rs(a) scanf("%s", a)
#define Pi(a) printf("%d\n", (a))
#define Pf(a) printf("%lf\n", (a))
#define Pl(a) printf("%lld\n", (a))
#define Ps(a) printf("%s\n", (a))
#define W(a) while(a--)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define exp 0.00000001
#define  pii  pair<int, int>
#define  mp   make_pair
#define  pb   push_back
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int a[maxn];
int n;
int main()
{
	Ri(n);
	for(int i=1;i<=n;i++)
	{
		Ri(a[i]);
	}
	int ans=n;
	for(int i=n;i>=1;i--)
	{
		if(a[i]==n)
		{
			n--;
			ans--;
		}
	}
	Pi(ans);
 return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Marcus-Bao

万水千山总是情,只给五角行不行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值