找水王2
Posted 狞_JML
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找水王2相关的知识,希望对你有一定的参考价值。
-
- 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?
设计思想:
下面是找水王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。继续第二步,直到遍历结束。
4.遍历结束,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 }
截图:
个人总结:
虽然题目有变化,但算法都是相通的。遇到新题目先想想有没有可以套用的算法,既能解决问题,又能加深对算法的理解和对实际问题的分析能力。
以上是关于找水王2的主要内容,如果未能解决你的问题,请参考以下文章