個人專案 找水王續

2022-08-25 19:54:43 字數 1964 閱讀 6607

一、程式要求

三人行設計了乙個灌水論壇。資訊學院的學生都喜歡在上面交流灌水,傳說在論壇上有乙個「水王」,他不但喜歡發帖,還會回覆其他id發的每個帖子。坊間風聞該「水王」發帖數目超過了帖子數目的一半。

隨著論壇的發展,管理員發現水王沒有了,但是統計結果表明,有三個發帖很多的id。據統計他們的發帖數目都超過了帖子總數目n的1/4。你能從發帖id列表中快速找出他們的id嗎?

二、程式設計思想

題目給出:發帖數目都超過了帖子總數目n的1/4,把回帖列表簡單化——乙個陣列裡,存著若干數,其中三個數的數目均超過陣列中所有數的數目的1/4。若每次刪除四個不同的id(不管是否包含發帖數目超過總數1/4的id),那麼,在剩下的id列表中,原先發帖比例大於1/4的id所佔比例仍然大於1/4,可以通過不斷重複這個過程,把id列表中的id總數降低**化為更小的問題),從而得到問題的答案。所以,每四個數比較:若四個數都不相同,將前三個數設為水王,並刪除這四個數,對應的目前水王出現次數均減1,且對結果無影響;若有相同的數,對應的目前水王出現次數加1,接著比較接下來的數,重複上述過程,一直到最後乙個數,找到這三個水王。

三、源程式

//

李俏,找水王續抽象程式

#include

using

namespace

std;

void findwaterking(int id, int num, int wkresult[3

])

else

if (id[i] == wkresult[1])//

水王2出現次數統計

else

if (id[i] == wkresult[2])//

水王3出現次數統計

else

if (wknum[0] == 0)//

將前三個不同的數先存為水王

else

if (wknum[1] == 0)//

將前三個不同的數先存為水王

else

if (wknum[2] == 0)//

將前三個不同的數先存為水王

else

//此時找到四個不同的數,刪除,並且出現次數減1,但是次數不一定為0

}}int

main()

cout

<< "

請輸入帖子id:

"<

for (i = 0; i < num; i++)

findwaterking(arr, num, wkresult);

cout

<< "

3個水王的id分別是:";

for (j = 0; j < 3; j++)

cout

<< wkresult[j] << "";

cout

<

return0;

}

四、結果截圖

五、心得體會

有了上次的經驗,我沒有暈,而是根據經驗將四個數分為一組,但是對於程式還是有些沒頭緒,不過沿著上次的思路——設前三個不同的數為水王,通過比較,留下出現次數最多的三個數。上次的實驗有好多不足,如沒有考慮陣列為空的情況、不能用void main()、應該將主要演算法用函式封裝起來等等。通過這次課堂練習,我能夠舉一反三的分析問題,這是一點進步,但是對於將語言轉化為程式**這一塊兒,還是有點兒欠缺,希望以後的練習中可以有所進步。實現過程中,出現了不少問題,但是已經在查資料和除錯下解決了。

個人專案找水王

一 題目要求 二 設計思想 水王問題就是根據消消樂遊戲的乙個變形,消消樂是消除相同的圖案,而找出水王則是刪掉相鄰的不同的id,由於 水王 發帖數目超過了帖子數目的一半,這樣剩下的id一定是水王的id。這樣就滿足了時間複雜度為o n 的要求。三 程式 includevoid main 假設的id號 i...

個人專案4 找水王

設計思想 遍歷一遍id列表,進行兩兩比較 如兩個id不同就都刪掉 如果相同,出現這個id的次數加一 水王的帖子超過一半,遍歷到最後剩下的只有水王的id 實現資料 截圖 實現 include using namespace std int find int id,int n else else nti...

找水王問題

設計思路 起初看到這道題第乙個想法就是先排序再找出最中間乙個id,但是老師要求時間複雜度是o n 所以這個思路被放棄。高長志同學提出了另一種思路。由於水王的id出現的次數佔總數的一半,所以從頭遍歷一遍,先存入第乙個id,依次與後面的id比較,遇到相同的id,計數器加1 遇到不同的id,計數器減1,當...