排序 構造題

2021-10-02 04:04:48 字數 771 閱讀 4572

題意:給出一段包含』a』,『t』,『g』,『c』的序列,每個字母可以和左右字母交換位置,每次交換造成乙個消耗,構造出』a』,『t』,『g』,'c』分別連續的序列,求出最小的消耗。

解析:首先列舉24種可能,即』a』,『t』,『g』,'c』的排列順序,統計每種可能的消耗。對於求每種情況的消耗,需要乙個類似於求逆序數的思想。假設求atgc的情況,那麼遍歷原序列,沒到乙個字母邊查詢在它之前且序列優先順序(即a的優先順序最高,t,g,c依次降低)沒它高的字母有多少個。這些字母一定要被移動到它後邊的,那麼統計數加上這些字母的個數,那麼這些字母就算是到它後邊了。查詢可以用字首陣列

**:

#include

using

namespace std;

char s[

200010];

map<

char

,int

> mmp;

int flag[

2000010];

intmain()

;long

long min=long_long_max;

while

(next_permutation

(a+1

,a+4+1

))flag[mmp[s[i]]]

++;} min=

min(ans,min);}

cout

}

序列 構造題

首先 最多有乙個數字同時出現在最長上公升子串行和最長下降子串行中,所以若 a b n 1a b n 1,說明無解.然後考慮怎麼構造,將 分成若干個大小為 b b 的塊 可能會剩下乙個小塊 總共有 a nb a bn 個塊,則最長上公升子串行的長度至少為 a a,若 a a,說明無解.否則可以在塊內反...

構造題訓練

由於noip之前沒有怎麼做過構造,導致吃了大虧。構造 互動 基本問題 有一些數,假設有 n 個,有 m 個被標記,我們可以詢問乙個集合。我們可以得知這個集合內是否存在被標記的數。要求次數 o m log 2n 做法1 分治 考慮分治到當前區間 l,r 詢問 l,r 有沒有被標記的數。如果沒有,則返回...

程式設計題 構造回文

給定乙個字串s,你可以從中刪除一些字元,使得剩下的串是乙個回文串。如何刪除才能使得回文串最長呢?輸出需要刪除的字元個數。輸入描述 輸入資料有多組,每組包含乙個字串s,且保證 1 s.length 1000.輸出描述 對於每組資料,輸出乙個整數,代表最少需要刪除的字元個數。輸入例子 abcda goo...