poj1012 鍊錶和陣列

2021-06-09 21:12:29 字數 2335 閱讀 8083

一開始用單向迴圈鍊錶來實現,提交的時候編譯錯誤,看到好多人都是類似的錯誤,可能是**出了問題,其實即使沒問題也通不過的,當算到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.數...