hihocoder 1523 数组重排2 思维

来源:互联网 发布:adobe 全套mac破解版 编辑:程序博客网 时间:2024/06/06 00:11


题目链接


题意:

给定一个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_backusing 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;}

原创粉丝点击