ACM水題-Beautiful Sequence(AC,雜題,貪心思想?)

來源:互聯網
上載者:User

Beautiful Sequence

Time Limit:1000MS  Memory Limit:65536K
Total Submit:206 Accepted:28

Description

A sequence of numbers A[1], A[2], ..., A[N] is beautiful only if each number A[i] ≥ i ( 1 ≤ i ≤ n ). Given a sequence of numbers, your task is to turn it into beautiful sequence with minimal swap
operations between adjacent numbers.

Input

The first line of input gives the number of cases, T. T test cases follow.
The first line of each test case contains one integer N, and the second line contains N positive numbers.
(1 ≤ N ≤ 20, 0 ≤ A[i] ≤ 30 )

Output

For each test case, output the minimal swap times in a line.
If the sequence can’t be turned into beautiful sequence, just output “ugly sequence”.

Sample Input

251 2 3 5 441 3 1 4

Sample Output

1ugly sequence

Source

GDUT Monthly 2009.11, by lynncui

 

 

/*------------------------------------------------------------------------------------------------第一次看到這一道題的時候,還真的木有什麼想法,木有什麼感覺,找不到切入點,一下子找不到北。對於這一些貌似找規律的題目,自己都不是很在行。想來想去,不知道為什麼會聯想到作業系統記憶體管理那塊,聯想到了“首先適配演算法”、“最佳適配演算法”,不過這些想法,貌似沒有什麼作用,而且還說明我的知識體系夠混亂的。後來再想了幾下,發現都沒有什麼思路,連可行方案也沒有想到。然後,嗯,然後....拖延症就發作了....幾乎每天手機網頁都開著這一題的頁面,但是沒有看多少眼,而且就算看了,又是在自己的思路中打轉。後來,今天在床上休息的時候睡不著,拿起手機,再看看這一道題,索性認真思考一下,拒絕拖延症,結果想到了可行方案~~自己果然是比較慢熱的說~~~大概想法:輸入:一個序列,a[1]....a[N]。初始化:首先,找到最後一個不符合beautiful條件,也就是不符合a[i]>=i的元素,儲存其下標為nEroIndex保持:然後從nEroIndex遞減開始找到第一個符合a[i]>=nEroIndex的元素,然後進行交換操作,從中記錄交換的  次數。如果找不到這樣的元素,也就是醜陋的序列,跳出迴圈,列印結果。  例如序列:8 2 3 2 7   第一次操作後變成:2 3 2 8 7      交換操作進行的方向說一下:     下標nEroIndex以及之後的序列都符合beatiful的條件,所以nEroIndex下標之後的元素不用考慮,將錯誤 範圍縮小到1-(nEroIndex-1)之內,估計叫做將錯誤傳遞吧,將一個不合格元素向下標更小的傳遞,     因為要符合a[i]>=i,所以交換操作不可能向下標更大的方向進行。     第一次操作之後,要更新nEroIndex的值,這一部分見注釋。然後再跳到“保持”這一步,繼續交換。    正確性:從最後一個不合格元素逐漸向左進行交換操作,將不合格序列範圍不斷縮少,直到找不到        一個a[i]>=nEroIndex或者i<1為止。    其實就是有兩個選擇的問題,一個就是初始化步驟和更新nEroIndex找第一個不合格元素還是最後一個不合格元素?我選了最後一個。另外一個就是找最近的一個符合a[i]>=i的下標還是最遠的一個呢?我選了最近一個。這裡都用到了貪心思想,因為要求用最少步數,所以我從盡量小去動已經符合a[i]>=i這個條件的元素。不過,後來發現貌似選哪一個都沒有影響,呵呵~~~狀況:AC,0MS------------------------------------------------------------------------------------------------*/#include<stdio.h>int a[24] ;int main(void){int n = 0 ;int i = 0 ;int j = 0 ;int t = 0 ;int nEroIndex = 0 ;int fCan = 0 ; int nSwapTimes = 0 ;int nTemp = 0 ;int nNoneEro = 1 ; int nNextIndex = 0 ;scanf("%d",&t) ;while(t-- > 0){fCan = 1 ; nSwapTimes = 0 ;nEroIndex = 0 ;nNoneEro = 1 ;  nNextIndex = 0 ;scanf("%d",&n) ;for(i = 1 ; i <= n ; ++i){scanf("%d",&a[i]) ;if(a[i] < i){nEroIndex = i ;fCan = 0 ;}}for(i = nEroIndex ; i >= 1 ; --i){if(a[i] >= nEroIndex){fCan = 1 ; nTemp = a[i] ; for(j = i ; j < nEroIndex ; ++j){a[j] = a[j+1] ;nSwapTimes++ ;}a[nEroIndex] = nTemp ;nEroIndex-- ;if(a[nEroIndex] >= nEroIndex){nNoneEro = 1 ; nNextIndex = nEroIndex ; for(j = 1 ; j <= nNextIndex ; ++j){if(a[j] < j){nEroIndex = j ;nNoneEro = 0 ; fCan = 0 ;}}if(1 == nNoneEro){fCan = 1 ; break ;}else{i = nEroIndex+1 ;fCan = 0 ;}}else{i = nEroIndex+1 ;fCan = 0 ; }}}if(1 == fCan){printf("%d\n",nSwapTimes) ;}else{puts("ugly sequence") ;}}return 0 ;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.