24h購物| | PChome| 登入
2009-04-25 20:29:32| 人氣1,591| 回應0 | 上一篇 | 下一篇

ACM 11351 11351 - Last Man Standing

推薦 0 收藏 0 轉貼0 訂閱站台

http://zh.wikipedia.org/wiki/%E7%BA%A6%E7%91%9F%E5%A4%AB%E6%96%AF%E9%97%AE%E9%A2%98 

我們將明確解出k = 2時的問題。對於k\neq 2的情況,我們在下面給出一個一般的解法。

f(n)為一開始有n個人時,生還者的位置。走了一圈以後,所有偶數號碼的人被殺。再走第二圈,則新的第二、第四、……個人被殺,等等;就像沒有第一圈一樣。如果一開始有偶數個人,則第二圈時位置為x的人一開始在第2x − 1個位置。因此位置為f(2n)的人開始時的位置為2f(n) − 1。這便給出了以下的遞推公式:

f(2n)=2f(n)-1.\,

如果一開始有奇數個人,則走了一圈以後,最終是號碼為1的人被殺。於是同樣地,再走第二圈時,新的第二、第四、……個人被殺,等等。在這種情況下,位置為x的人原先位置為2x + 1。這便給出了以下的遞推公式:

f(2n+1)=2f(n)+1.\,

如果我們把nf(n)的值列成表,我們可以看出一個規律:

n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
f(n) 1 1 3 1 3 5 7 1 3 5 7 9 11 13 15 1

從中可以看出,f(n)是一個遞增的奇數數列,每當n是2的冪時,便重新從f(n) = 1開始。因此,如果我們選擇m和l,使得n = 2m + l0\leq l<2^m,那麼f(n)=2 \cdot l+1。顯然,表格中的值滿足這個方程。我們用數學歸納法給出一個證明。

定理:如果n = 2m + l0\leq l<2^m,則f(n) = 2l + 1

證明:n應用強歸納法n = 1的情況顯然成立。我們分別考慮n是偶數和n是奇數的情況。

如果n是偶數,則我們選擇l1m1,使得n/2 = 2^{m_1}+l_1,且0\leq l_1 < 2^{m_1}。注意l1 = l / 2。我們有f(n) = 2f(n / 2) − 1 = 2((2l1) + 1) − 1 = 2l + 1,其中第二個等式從歸納假設推出。

如果n是奇數,則我們選擇l1m1,使得(n-1)/2 = 2^{m_1}+l_1,且0\leq l_1 < 2^{m_1}。注意l1 = (l − 1) / 2。我們有f(n) = 2f((n − 1) / 2) + 1 = 2((2l1) + 1) + 1 = 2l + 1,其中第二個等式從歸納假設推出。證畢。

答案的最漂亮的形式,與n的二進位表示有關:把n的第一位移動到最後,便得到f(n)。如果n的二進位表示為n=b_0 b_1 b_2 b_3\dots b_m,則f(n)=b_1 b_2 b_3 \dots b_m b_0。這可以通過把n表示為2m + l來證明。

在一般情況下,這個問題的最簡單的解決方法是使用動態規劃。利用這種方法,我們可以得到以下的遞推公式:

f(n,k) = (f(n − 1,k) + k)mod nf(1,k) = 0

如果考慮生還者的號碼從n - 1n是怎樣變化的,則這個公式是明顯的。這種方法的運行時間O(n),但對於較小的k和較大的n,有另外一種方法,這種方法也用到了動態規劃,但運行時間為O(klogn)。它是基於把殺掉第k、2k、……、2\lfloor n/k \rfloor個人視為一個步驟,然後把號碼改變。

這是一個動態規劃的問題

/********************************************************/

#include<stdio.h>
#include<stdlib.h>
main()
{
  int t,n,k,time=1;
  scanf("%d",&t);
  while(t--)
   {
    int a,b,c,ans=0;
    scanf("%d %d",&n,&k);
    printf("Case %d: ",time++);
     for(a=2;a<=n;a++)
      ans=(ans+k)%a;
     printf("%d\n",ans+1);
   }
  return 0;
}

台長: 來源不明
人氣(1,591) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ACM |
此分類下一篇:ACM 315 Network
此分類上一篇:ACM 10929 Q10929: You can say 11

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文