标签:
设计思想:
下面是找水王1的设计思想:
这是一个查找数组中出现频率最高值的问题,不一样的是已知条件中有一点为出现频率最高值出现频率大于0.5。
按照常规思路可以逐个统计出现过的每个ID出现过的次数。本次作业要求新思路,即
1.计第一个shuiwangId=ID[0]出现过Times=1次;
2.遍历下一个ID,如果跟shuiwangId相同,Times++,否则,Times--。如果nTimes == 0,重复第一步;
3.遍历结束,shuiwangId就是水王ID。
这次与之不同的是,水王数量变成了3个。上述算法仍可延续,但需做修改,由于三个水王相互之间不冲突,故可定义三个水王,再与其它ID相抵消。
具体思路如下:
1.设三个水王ID:shuiwang1、shuiwang2、shuiwang3个出现过分别Times1=Times2=Times3=0次;
2.遍历下一个ID并与三个水王ID比较,如果跟shuiwangN相同,TimesN++,否则,Times1、Times2、Times3均减一。
3.如果某一shuiwangN出现的次数TimesN==0并且当前遍历的ID与之不同,将当前遍历的ID设为这一shuiwangN的ID,并使TimesN=1。继续第二步,直到遍历结束。
3.遍历结束,shuiwang1、shuiwang2、shuiwang3分别是三个水王的ID。
代码:
1 #include<iostream> 2 #include<fstream> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 ifstream IDFile("ID.txt"); 8 string buffer; 9 string shuiwang1 = ""; 10 string shuiwang2 = ""; 11 string shuiwang3 = ""; 12 int IdNum = 0;; 13 int Times1 = 0; 14 int Times2 = 0; 15 int Times3 = 0; 16 cout << "ID列表:"; 17 for (;;) 18 { 19 if (IDFile.eof()) 20 { 21 break; 22 } 23 IDFile >> buffer; 24 IdNum += 1; 25 cout << endl << buffer; 26 if (shuiwang1 == buffer) 27 { 28 Times1 += 1; 29 } 30 else if (shuiwang2 == buffer) 31 { 32 Times2 += 1; 33 } 34 else if (shuiwang3 == buffer) 35 { 36 Times3 += 1; 37 } 38 else if (Times1 == 0) 39 { 40 Times1 += 1; 41 shuiwang1 = buffer; 42 } 43 else if (Times2 == 0) 44 { 45 Times2 += 1; 46 shuiwang2 = buffer; 47 } 48 else if (Times3 == 0) 49 { 50 Times3 += 1; 51 shuiwang3 = buffer; 52 } 53 else 54 { 55 Times1 -= 1; 56 Times2 -= 1; 57 Times3 -= 1; 58 } 59 } 60 IDFile.close(); 61 cout << endl << "共" << IdNum << "贴。" << endl << endl << "水王1ID:" << shuiwang1 << endl << "水王2ID:" << shuiwang2 << endl << "水王3ID:" << shuiwang3 << endl; 62 return 0; 63 }
截图:
个人总结:
虽然
标签:
原文地址:http://www.cnblogs.com/ning-JML/p/5535605.html