三人行設計了一個灌水論壇。資訊學院的學生都喜歡在上面交流灌水,傳說在論壇上有一個“水王”,他不但喜歡發帖,還會回複其他ID發的每個文章。坊間風聞該“水王”發帖數目超過了文章數目的一半。
要求:如果你有一張目前論壇的文章(包括回帖)清單,其中文章的作者的ID也在其中,你能快速的找到這個傳說中的水王嗎?
解決方法:
對所面臨的問題進行簡化,由于“水王”發帖數目超過了文章數目的一半,由此可以作為突破口,尋找簡單的方法,來解決,可以将發帖的ID看成一位數組,簡化為,在一位數組中,查找一半以上相同的元素。采用消除法實作,比較簡單,即對相鄰的不同的元素消除,相同的元素,則不消除,并且對num(計數)加1,最終剩下的元素即為索要查找的元素。
代碼:
//找水王
//李妍 20133093
//三人行設計了一個灌水論壇。資訊學院的學生都喜歡在上面交流灌水,傳說在論壇上有一個“水王”,
//他不但喜歡發帖,還會回複其他ID發的每個文章。坊間風聞該“水王”發帖數目超過了文章數目的一半。
//要求:如果你有一張目前論壇的文章(包括回帖)清單,其中文章的作者的ID也在其中,你能快速的找到這個傳說中的水王嗎?
#include<iostream>
using namespace std;
#define N 100
int main()
{
int Water_King = 0; //用來标記水王
int num = 0; //記錄消除後的次數
int num_tiezi = 0;//記錄文章的數目
int Tie[N];
while (num_tiezi == 0)//如果數組長度為零則請重新輸入
{
cout << "請輸入文章的數目:";
cout << endl;
cin >> num_tiezi;
}
cout << "輸入文章ID:" << endl;
for (int i = 0; i <= (num_tiezi - 1); i++)
{
cout << "("<<i+1<<"):";
cin >> Tie[i];
cout << endl;
if (Tie[i] == 0)
{
cout << "ID不能為0,請重輸:";
cout << "(" << i + 1 << "):";
cin >> Tie[i];
cout << endl;
}
}
for (int i = 0; i<num_tiezi; i++)
{
if (num == 0)//初始時,把數組第一個元素賦給Water_King,如果num為0,代表前i-1個中元素兩兩消完,重新指派
{
Water_King = Tie[i];
num = 1;
}
else
{
if (Water_King == Tie[i]) //相等不消除
num++;
else
num--;
}
}
cout << "水軍的ID是:" << Water_King << endl;
return 0;
}
測試結果:
試驗總結:該實驗解決的方法有很多種,考慮到時間的複雜度,選用該方法,能夠将時間複雜度降到最小,同時代碼實作起來,也比較簡單。同時采用這種方法,能夠為以後解決問題,提供了另一種不同的思路。
時間記錄日志:
