排列搜索-c#求解-英雄會在線編程題目

       反正晚上沒什麼事,吧排列搜索這道題也一併寫了吧。先看題目:

排列搜索
  • 發佈公司:
  • 有 效 期:
  • 賽    區:
  • CSDN                
  • 2014-01-282014-02-27
  • 北京
  • 難 度 等 級:
  • 答 題 時 長:
  • 編程語言要求:
  • 120分鐘
  • C C++ Java C#                 
題目詳情

設數組a包含n個元素恰好是0..n - 1的一個排列,給定b[0],b[1],b[2],b[3]問有多少個0..n-1的排列a,滿足(a[a[b[0]]]*b[0]+a[a[b[1]]]*b[1]+a[a[b[2]]]*b[2]+a[a[b[3]]]*b[3])%n==k    

輸入包含5個參數:N,K,B0,B1,B2,B3,其中 4<= N<12, 0 <= K,B0,B1,B2,B3 < N。

 

      這道題雖然是兩星的,但是感覺比剛纔那個瓶子和硬幣的要難一些。

猛一看,被題目搞得暈頭轉向,(a[a[b[0]]]*b[0]+a[a[b[1]]]*b[1]+a[a[b[2]]]*b[2]+a[a[b[3]]]*b[3])%n==k  

拐了兩道彎,所以,不能被題目牽着鼻子走,直接這樣看吧:(b[0]*a0+b[1]*a1.....)%n==k  

這樣就清晰多了。

 

思路:

第一步求出b[0]......b[3]四個數要乘以哪四個數,得到的結果和符合公式,注意,這裏b[0]...b[3]可能有相等,所以,查找之前先要合併下

這四個數在區間[0~n)裏面,第一步就很容找到。

 

第二步:

       將找到的四個數在數組a[n]中排序,關鍵就在這裏,排序的過程需要檢查,是否符合條件,舉例來說:比如n=10,b[0]=3,找到的第一個數a0=2,那麼就是將2依次放到a[10]數中的每個位置,對應的a[3]必須只想2所放的索引。比如,2放在a[0]=2,那麼就有a[3]=0;同時我們還可以很容的得到:

當a0 != b[0]時,a0在a[]數中中的索引不能是a0和b[0]

其實第二步就是將第一步求出的數排序,看看符合條件的有多少個,最後累加就得到答案了。

 

思路就是這樣的,代碼寫的有點囉嗦,感覺不太理想,提交上去,沒問題,通過了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章