一、題目及題目要求
題目:三人行設計了一個灌水論壇。資訊學院的學生都喜歡在上面交流灌水,傳說在論壇上有一個“水王”,他不但喜歡發帖,還會回複其他ID發的每個文章。坊間風聞該“水王”發帖數目超過了文章數目的一半。
如果你有一張目前論壇的文章(包括回帖)清單,其中文章的作者的ID也在其中,你能快速的找到這個傳說中的水王嗎?
二、設計思路:
1、把文章清單,抽象為一個一維數組arr[NUM],輸入長度length為id總數,每個數組元素為一個id。
2、再設定一個循環,按照順序來依次兩兩比較,如果作者id相同則保留,如果作者id不同則消除。
3、最後剩下id即為水王id
三、源程式:
#include<iostream>
using namespace std;
#define NUM 100
int find(int arr[], int n)//找水王函數
{
int sw = 0; //
int count=0; //标記
for(int i=0;i<n;i++)
{
if(count == 0)//初始時,把數組第一個元素賦給sw
{
sw = arr[i];
count = 1;
}
else
{
if(sw == arr[i]) //相等不消除
count ++;
else
count --;
}
}
return sw;
}
int main()
{
int length=0;
while (length==NULL||length == 0)//如果數組長度為空或零則請重新輸入
{
cout<<"請輸入ID數量:";
cin>>length;
}
int arr[NUM];
cout<<"輸入作者id(不為0):"<<endl;
for(int i=0;i<=(length-1);i++)
{
cin>>arr[i];
if(arr[i]==0)
{
cout<<"id不為0,請重新輸入:";
cin>>arr[i];
}
}
int ID=find(arr,length);
cout<<"水軍的ID是"<<ID<<endl;
return 0;
}
四、運作截圖

五、項目計劃日志
周活動總結表
姓名:魏** 日期2016.5.19
日期 任務 | 聽課 | 編寫程式 | 閱讀課本 | 準備考試 | 日總計 |
周一 | 100 | 30 | 130 | ||
周三 | |||||
周四 | |||||
周總結 | 60 | 260 |
階段時間和效率 周數(上一次周活動表的周數+1):
不包括上一周在内的累計時間
總計 | 100 | 60 | 260 | |
平均 | ||||
最大 | ||||
最小 |
以前各周的累計時間
60 | ||||
六、時間記錄表:
學生 魏** 日期 2016年5月19日
教師 王** 課程 軟體工程
日期 | 開始時間 | 結束時間 | 中斷時間 | 淨時間 | 活動 | 備注 |
5.16 | 14:30 | 16;20 | 10 | 上課 | ||
18:30 | 19:00 | 無 | 看書 | |||
5.18 | 22:00 | 22:30 | ||||
5.19 | 14:30 | 16:30 | 無 | 作業 |
七、個人總結
這個題目,一開始沒有思路,在老師的啟發下一開始到的是周遊清單,統計每個id出現的次數。後來老師提到了周遊然後排序,中間項肯定是水王ID,可是時間複雜度為n*n,為了降低時間複雜度,老師提示用兩兩消除的思想,後來我們就想到了如何解決。一道題目有好多種解法,我們應當拓寬思路,多看一些算法書籍,多練習寫程式,孰能生巧。