NKOJ4223 彩色方塊 題解

2021-08-03 17:24:21 字數 1525 閱讀 7995

一道關於逆序對的題目。

乍一看,字母不好處理,因此以一開始方塊排列的情況作為標準從1~n標號,然後按這個編號給方塊的目標排列情況標號。如下所示:

r g b -> g b r

1 2 3 -> 2 3 1

若字母相同,就要使開始和目標方塊的編號差距盡量小,這樣,才能使操作次數最少(小小的貪心)。如下所示:

a a c b -> b a c a

1 2 3 4 -> 4 1 3 2

(若目標方塊的編號為4 2 3 1,則最小運算元為5)

把問題轉化一下:給定一無序列,通過交換相鄰元素使該序列變為有序列的最少交換次數。

這不就是求該無序列的逆序對的數量嗎?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

證明(逆序對數==最小交換次數):

以4 1 3 2為例

第一步,將最大的數字放到最後,即將大數與小數交換位置,並把大數交換到最後面,得到1 3 2 4,這一步共進行了3次交換操作;

第二步,將最大的數字刪去,得到1 3 2,重複第一步,得到1 2 3,這一步共進行了一次交換操作。

得到有序列後,將操作次數相加,正好是逆序對的個數。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

接下來就好辦了,**很好寫。

寫**的過程中,還有乙個問題就是如何給字母編號。有乙個笨辦法就是下面**中的注釋,利用陣列存位置;另外乙個聰明的辦法與笨辦法的思想類似,但是用的是佇列存位置:給每乙個字母乙個佇列,遇到一次該字母就將其位置入隊,遍歷目標字母序列式時,只需要訪問相應字母的隊首位置並將其出列。

**總結:

1.通常字母要轉化成數字處理。

2.無序列中,逆序對的個數==最小交換次數。

#include

#include

#include

#define n 1000100

#define ll long long

using

namespace

std;

ll tree[n];queue

pos[30];

char st[n],en[n];

ll g(char x)

ll lowbit(ll x)

void add(ll x)

int main()

ll ans=0;

for(ll i=1;i<=n;i++)

printf("%lld",ans);return

0;}

4 22學習總結

今天繼續學習python想要爬取研究生招生資訊網的資料並存入資料庫 遇到的困難 爬取資料還不熟練,我只得到了一行一列 哭唧唧 總結 import bs4import pymysql import requests from bs4 import beautifulsoup import pandas...

錯題整理(422)

表尾是指除去表頭後剩下的元素組成的表,表頭可以為表或單元素值,表尾是指除去表頭後剩下的元素組成的表 即使只剩乙個元素也視為表 可以為空表。有乙個100 90的稀疏矩陣,非0元素有10個,設每個整型數占2位元組,則用三元組表示該矩陣時,所需的位元組數是 每個元素要用行號,列號,元素值來表示,在用三元組...

4 2 2 螢幕保護程式

依次選擇 系統 首選項 螢幕保護程式 命令開啟 螢幕保護程式首選項 對話方塊,如圖 4.10 所示。要開啟螢幕保護功能,應該確保在 計算機空閒時啟用螢幕保護程式 核取方塊中打鉤。在左側的 主題 列表框中選擇相應的屏保主題,就可以在右側的預覽框中看到效果。ubuntu 附帶了很多螢幕保護主題,其中一些...