一道關於逆序對的題目。
乍一看,字母不好處理,因此以一開始方塊排列的情況作為標準從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 附帶了很多螢幕保護主題,其中一些...