一開始用單向迴圈鍊錶來實現,提交的時候編譯錯誤,看到好多人都是類似的錯誤,可能是**出了問題,其實即使沒問題也通不過的,當算到k=10的時候就已經很卡了。換了一種方法,用陣列來實現,這下**好了,確實還是tle,到10的時候雖然比用鍊錶要快一些,但還是卡。最後實在沒轍,看到網上有人用數學的方法,推出計算m的公式。沒仔細去看推的過程。最後只能用自己用陣列實現的方法來計算出1-13對應的m值,然後打表了~~不過,這道題還是讓我運用了一下鍊錶,以前都沒怎麼實際運用過。
方法一:用鍊錶來實現(會超時)
#include#include#includestruct node
;typedef node *ptrtonode;
typedef ptrtonode list;//指向結點的鍊錶
typedef ptrtonode position;
int *excuted;
position find(int x, list list);//查詢鍊錶中的元素x,返回其位置
int result[14]=;//將已經計算過得k對應的m值儲存起來,便於下次直接使用
int main()
kk = 2*k;
list = (node *)malloc(sizeof(node));
excuted = (int *)malloc(sizeof(int)*kk);
if(list==null || excuted==null)
memset(excuted, 0, sizeof(int)*kk);
list->num = 1;//每個結點儲存每個人的編號,無頭結點
list->next = null;
for(i=2; i<=kk; i++)
p->num = i;
//printf("%d\n", p->num);
if(list->next==null)
else
ptemp = p;
p->next = null;
} p->next = list;//迴圈鍊錶
p = list;
/*for(i=0; inum);
p = p->next;
}*/m = k+1;
p = list;
while(count!=k)
else if(excuted[p->num-1]==0)
}//printf("%d\n", p->num);
if(p->num<=k)//該m不合適,恢復excuted,增加m,重新開始
count = 0;
p = list;
}else
p = p->next;
count++;
}} printf("%d\n", m);
result[k-1] = m;
//釋放鍊錶
p = list->next;
for(i=0; inext;
free(p);
p = ptemp;
} free(list);
free(excuted);
} return 0;
}
方法二:用陣列來實現
#include#includeint num[26]=;//儲存每個人的編號
int excuted[26];//標記被處死的人,為1表示已經被處死
int result[13]=;//將已經計算過得k對應的m值儲存起來,便於下次直接使用
int main()
kk = 2*k;
for(i=0; i=kk)//到達陣列的末尾
j=0;
}else if(excuted[num[j]-1]==0)
i++;}}
//printf("%d\n", num[j]);
if(num[j]<=k)//該m不合適,恢復excuted,增加m,重新開始
}count = 0;
j = 0;
}else
count++;
}} printf("%d\n", m);
result[k-1] = m;
} return 0;
}//用上述方法能得到正確結果,但是當k到10的時候就會卡,要超時
//實在沒找到好的方法,只能先將結果算出再通過打表來輸出結果
//可以參考
//用數學方法來推出計算m的公式
#includeint result[13]=;//將已經計算過得k對應的m值儲存起來,便於下次直接使用
int main()
} return 0;
}
POJ 1012 約瑟夫問題
我是直接模擬的,因為實在想不到什麼好辦法,不過看到0 俗話說得好,不管黑貓白貓,抓到老鼠的就是好貓。於是在自家電腦模擬,打個表,就ac了。至於還有沒有其他方法,有待研究,大家有什麼好方法,請賜教,謝謝!1 模擬 方法是,m從2開始判斷,在1,2,3,2k中,每次找到第m個數,判斷如果是大於k的,那麼...
poj 1012 約瑟夫置換
一開始用的不是約瑟夫置換 關鍵是要儲存之前求出的值。因為只有13個數,所以也可以另開程式手動求出所有k值塞進陣列,這樣每次查詢都是o 1 0ms了 首先m值必須在 k 1 2kn,2k n 1 n 0,1,2 之間,然後 列舉。include include include include incl...
POJ 1012 約瑟夫環
poj的約瑟夫環問題是原本約瑟夫環的一種變形。約瑟夫環 有n個人,從第乙個人開始報數,數到第m個人就退出,依次迴圈,最後剩下的人為勝利者。可以用迴圈鍊錶和陣列的方法做,當m,n比較小時可以一試 迴圈鍊錶,數到就刪除,數到只剩乙個就輸出 陣列,第0個位置數值置為n,其他照常 a 1 1,a 2 2.數...