河工大校賽E 某科學的打麻將

2021-07-31 07:12:58 字數 2428 閱讀 4562

時間限制: 1 秒  

記憶體限制: 64 mb

提交: 74  

解決: 11 提交

狀態 題目描述

過年打麻將果然是一項必備技能(霧),打麻將的起手式是整理好自己手中的牌,現在你有十三張牌(只可能出現一萬到九萬,一筒到九筒,一條到九條),你要把這些牌整理好,使得相同花色的牌必須在連續的唯一一段(即所有的"萬"要放在一起,所有的"條"要放在一起,所有的"筒"要放在一起。),每段內牌是按照從小到大的順序排列(「萬」,「條」,「筒」的順序沒有要求)。你每次只能將當前牌中的任意一張牌放到最左邊或者最右邊。請問最少經過多少次可以使得牌被整理好。

一萬到九萬,用數字1-9表示

一筒到九筒,用小寫字母a-i表示

一條到九條,用大寫字母a-i 表示 輸入

第一行 乙個數字t代表資料組數(t<=10000)

接下來每行 13個字元 代表初始的牌 輸出

t行每行乙個數字,代表答案

樣例輸入

1

3abcabbdefg11

樣例輸出
1
提示

樣例解釋

我們把3 

放到 最右邊就好了

abcabbdefg113   

題目分析:最終狀態有6種,我們需要列舉每一種情況並統計移動次數的最小值。對於一種情況來說,我們求最小值的方法如下:

假如字串的初始狀態為s:aabcbdaec

為了清晰沒有寫全,結束狀態t:aaabbccde

匹配的原則是:在s中抽取一部分字元按其位置的順序排成字串,這個字串是t的子串,假設我們選取aabcbdaec 組成aabbc,aabbc就是t的乙個子串,而s變成t的其中一種方式就是將其餘的字元按順序移動到相應的位置,對於s是將a移動到左邊,cde移動到右邊,這樣做的原理是規則要求只能將乙個字元移到左邊或者右邊,沒有移動過的字元(紅色)相對位置是不變的,並且紅色字元最後會在中間組合在一起,而周圍的字元可以隨意組合並且組合方式與移動次數無關,可以直接算出移動次數。這樣就要求紅色字串必須為t的子串,而我們需要求可匹配的最大子串長度。

注意這裡有誤導,就是t是按大小排序的,但不是求最長上公升子串行,因為最長上公升子串行不一定是子串,如上文最長上公升子串行aabcde,但不是子串。

具體實現dp就好了,dp[i][j]表示s的前i個和t的前j個字元最大匹配長度,遞推公式:dp[i][j]=dp[i-1][j-1](s[i]=t[j])||dp[i-1][j](s[i]!=t[j])

//

// main.cpp

// 某科學的打麻將2

//// created by teddywang on 2017/4/27.

//#include #include#include#includeusing namespace std;

int t;

char s[14];

char tnumb[14],tlow[14],tupp[14];

int len=13;

int ln,ll,lu;

int ans;

char buf[14];

int dp[20][20];

int solve()

sort(tupp,tupp+lu);

sort(tlow,tlow+ll);

sort(tnumb,tnumb+ln);

memset(buf,0,sizeof(buf));

strcat(buf,tupp);strcat(buf,tlow);strcat(buf,tnumb);

ans=solve();

memset(buf,0,sizeof(buf));

strcat(buf,tupp);strcat(buf,tnumb);strcat(buf,tlow);

ans=min(ans,solve());

memset(buf,0,sizeof(buf));

strcat(buf,tlow);strcat(buf,tupp);strcat(buf,tnumb);

ans=min(ans,solve());

memset(buf,0,sizeof(buf));

strcat(buf,tlow);strcat(buf,tnumb);strcat(buf,tupp);

ans=min(ans,solve());

memset(buf,0,sizeof(buf));

strcat(buf,tnumb);strcat(buf,tlow);strcat(buf,tupp);

ans=min(ans,solve());

memset(buf,0,sizeof(buf));

strcat(buf,tnumb);strcat(buf,tupp);strcat(buf,tlow);

ans=min(ans,solve());

printf("%d\n",ans);

}}

武大校賽E題

題意是給定一副無向圖,然後求走了t步之內,從起點到終點有多少走法,有個地方題面沒有說清楚,就是走到點n之後不能再往別的點走了 鄰接矩陣,乘t次之後,map i j 就是從i點走到j點的且走t步時的走法。我們把矩陣中n到其他點的路徑去掉,所以我們要算的就是 map 1 n i 1 i t 就是答案了 ...

2020西工大校賽 C王國(LCA)

典型的樹上求兩點間距離最大值,lca的做法 這題要求同乙個陣營,不妨先將同屬乙個陣營的先存進陣列,之後每組進行比較 比較時取出深度最深的,因為這個一定是答案中兩點中的其中乙個答案,這是樹的性質,不妨可以想一想 includeusing namespace std typedef long long ...

廣工大校賽3 26 H題 字首和

今天是校賽的日子,為了慶祝這麼喜慶的日子,tmk打算買些禮物給女票 lsh慶祝一下。tmk進入了雪梨超市,然後剛踏入的一瞬間,店主就對 tmk說 恭喜你成為了本店第 2147483647 位顧客,本店在搞乙個活動,對本店第 2147483647 位顧客進行贈送活動。你先看看你有多少錢?tmk一摸口袋...