1. 程式人生 >實用技巧 >其它 >(牛客小白月賽34)dd愛科學1.0

(牛客小白月賽34)dd愛科學1.0


連結: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

解題思路:
用一個數組記錄符合非遞減形式的字母序,當找到後面比前面小的字母時,從陣列中查詢當前字母的位置替換(如圖樣例),陣列一定是遞增的。最後用長度減陣列個數就行了。

(牛客小白月賽34)dd愛科學1.0

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);
}