H - 憨憨的錘子(sdut 6.21重現賽)(最長上升子序列+思維)

【問題】

賈隊長交給錘子學弟一個艱鉅的任務,就是去把集訓隊書架上的書整理好。書架上一共有n本書,編號爲1~n,要求是把書按照編號的升序排好,錘子學弟不愧是學長們公認的憨憨,他每次只會拿出一本書,然後把它放到所有書的最前端或最後端。因爲錘子學弟自帶“渣男”體制,他有更重要的事情去做,所以他想盡快完成任務。現在請你告訴憨憨的錘子學弟他最少移動幾次能夠完成任務。

【輸入】

第一行一個整數n(1<=n<=1e5) 第二行爲n個1~n之間的整數,沒有重複

【輸出】

一個整數表示錘子學弟最少需要移動的次數

【思路】

這道題要求最少移動幾次,另外一個角度來考慮,那就是哪些不用移動。
哪些不用移動呢,就是滿足上升,且兩數間相差爲1的子序列,當確定了這些不移動的,其他的每個移動一次就可以恢復,所以這道題就演化成了最長上升子序列(兩數相差爲一),然後就 n - 最長上升子序列的長度就可以解出來了

【源代碼】

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[100010];
int pd[100010];
int main()
{
    int n;
    int maxx = -1;
    cin >> n;
    for(int i=1;i<=n;i++)
        cin >> a[i],pd[i]=0;
    for(int i=1;i<=n;i++)
        pd[a[i]]=pd[a[i]-1]+1;
    for(int i=1;i<=n;i++)
        maxx = max(maxx,pd[i]);
    cout << n - maxx <<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章