(牛客小白月賽34)dd愛科學1.0
阿新 • 來源:網路 • 發佈:2021-05-31
連結:https://ac.nowcoder.com/acm/problem/221822
來源:牛客網
大科學家dddd最近在研究轉基因白菜,白菜的基因序列由一串大寫英文字母構成,dddd經過嚴謹的推理證明發現,只有當白菜的基因序列呈按位非遞減形式時,這株白菜的高附加值將達到最高,於是優秀的dddd開始著手修改白菜的基因序列,dddd每次修改基因序列的任意位需要的代價是11,dddd想知道,修改白菜的基因序列使其高附加值達到最高,所需要的最小代價的是多少。
輸入描述:
第一行一個正整數n(1≤n≤1000000) 第二行一個長度為n的字串,表示所給白菜的基因序列 保證給出字串中有且僅有大寫英文字母
輸出描述:
輸出一行,表示最小代價
示例1
輸入
5
ACEBF
輸出
1
說明
改成ACEEF或者ACEFF,都只用改動一個字元,所需代價最小為1
解題思路:
用一個數組記錄符合非遞減形式的字母序,當找到後面比前面小的字母時,從陣列中查詢當前字母的位置替換(如圖樣例),陣列一定是遞增的。最後用長度減陣列個數就行了。

AC詳細程式碼
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
string a;
cin>>a;
int b[100000],k=0; //記錄符合順序的個數,n-k為要換的個數
b[0]=-1;
for(int i=0;i<n;i++)
{
int w=a[i]-'A'+1;
if(w>=b[k]) //後面比前面大
{
b[++k]=w;
}else
{
int q=upper_bound(b,b+k,w)-b;//二分查詢到w的位置
b[q]=w;
}
}
printf("%d\n",n-k);
}
