BZOJ - 1609/USACO - Feb08 Silver Eating Together 麻煩的聚餐 重慶一中高2018級競賽班第九次測試 2016.9.10 Problem 2

【問題描述】
爲了避免餐廳過分擁擠,FJ要求奶牛們分3批就餐。每天晚飯前,奶牛們都會在餐廳前排隊入內,按FJ的設想,所有第3批就餐的奶牛排在隊尾,隊伍的前端由設定爲第1批就餐的奶牛佔據,中間的位置就歸第2批就餐的奶牛了。由於奶牛們不理解FJ的安排,晚飯前的排隊成了一個大麻煩。

第i頭奶牛有一張標明她用餐批次 D_i 的卡片。雖然所有N()頭奶牛排成了很整齊的隊伍,但誰都看得出來,卡片上的號碼是完全雜亂無章的。

在若干次混亂的重新排隊後,FJ找到了一種簡單些的方法:奶牛們不動,他沿着隊伍從頭到尾走一遍,把那些他認爲排錯隊的奶牛卡片上的編號改掉,最終得到一個他想要的每個組中的奶牛都站在一起的隊列,例如111222333或者333222111。哦,你也發現了,FJ不反對一條前後顛倒的隊列,那樣他可以讓所有奶牛向後轉,然後按正常順序進入餐廳。

你也曉得,FJ是個很懶的人。他想知道,如果他想達到目的,那麼他最少得改多少頭奶牛卡片上的編號。所有奶牛在FJ改卡片編號的時候,都不會挪位置。

【輸入格式】
第1行: 1個整數:N
第2..N+1行: 第i+1行是1個整數,爲第i頭奶牛的用餐批次D_i

【輸出格式】
第1行: 輸出1個整數,爲FJ最少要改幾頭奶牛卡片上的編號,才能讓編號變成他設想中的樣子

【輸入樣例】

5
1
3
2
1
1

【輸出樣例】

1

【數據範圍】
1<=D_i<=3
1<=N<=30,000

【樣例解釋】
隊列中共有5頭奶牛,第1頭以及最後2頭奶牛被設定爲第一批用餐,第2頭奶牛的預設是第三批用餐,第3頭則爲第二批用餐。如果FJ想把當前隊列改成一個不下降序列,他至少要改2頭奶牛的編號,一種可行的方案是:把隊伍中2頭編號不是1的奶牛的編號都改成1。不過,如果FJ選擇把第1頭奶牛的編號改成3,就能把奶牛們的隊伍改造成一個合法的不上升序列了。

思路:根據樣例解釋,很快想到了與最長不上升、最長不下降子序列的長度有關。再根據幾天前學習的求LIS長度的O(nlogn)算法寫出程序。

/*
    Name: dinner.cpp
    Copyright: Twitter & Instagram @stevebieberjr
    Author: @stevebieberjr
    Date: 10/09/16 15:56
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int n,a[30005],dp[30005]; 

int main()
{
    freopen("dinner.in","r",stdin);
    freopen("dinner.out","w",stdout);

    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }

    memset(dp,0,sizeof(dp));
    int cnt=0;
    dp[++cnt]=a[n];
    for(int i=n-1;i>=1;i--)
    {
        if(a[i]<dp[cnt])
        {
            int it=upper_bound(dp+1,dp+1+cnt,a[i])-dp;
            dp[it]=a[i];
        }
        else
        {
            dp[++cnt]=a[i];
        }
    }
    int ans=n-cnt;

    memset(dp,0,sizeof(dp));
    cnt=0;
    dp[++cnt]=a[1];
    for(int i=2;i<=n;i++)
    {
        if(a[i]<dp[cnt])
        {
            int it=upper_bound(dp+1,dp+1+cnt,a[i])-dp;
            dp[it]=a[i];
        }
        else
        {
            dp[++cnt]=a[i];
        }
    }

    ans=min(ans,n-cnt);

    printf("%d\n",ans);
    return 0;
}
發佈了74 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章