- 题目
三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
- 要求
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
- 思路
由于题目已经告诉我们水王的帖子数目超过了帖子总数的一半,所以对帖子做如下处理:
- 如果相邻两帖子ID不同,则抵消,不做其他处理。
- 如果相邻两帖子ID相同,则为嫌疑水王。再和当前水王比较,若和当前水王相同,当前水王水的可能性+2;若和当前水王不相同,当前水王水的可能性-2;若当前没有水王,那么嫌疑水王就做为水王。
- 如果当前水王水的可能性>0,那么就是水王,如果当前水王水的可能性=0,那么当前水王也就不是水王,再返回1。
- 最后的当前水王且水的可能性>0,那么他就是水王,否则没有水王。
对帖子数的奇偶分别处理,奇数的话单独对第一个id进行处理,偶数不做处理。
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int id[1000]; //发帖ID 6 int waterKing; //当前水王 7 int value = 0; //当前水王水的可能性 8 int num; //帖子数 9 cout << "请输入帖子数:"; 10 cin >> num; 11 if (num <= 0) 12 { 13 cout << "非法的输入"; 14 exit(1); 15 } 16 17 cout << "请输入发帖的ID:" << endl; 18 for (int i = 0; i < num; i++) 19 { 20 cin >> id[i]; 21 } 22 23 if (num % 2) //奇数 24 { 25 /*waterKing = id[0]; 26 value = 1;*/ 27 for (int i = 1; i < num; i+=2) 28 { 29 if (value > 0) //当前水王存在 30 { 31 if (id[i] == id[i + 1]) 32 { 33 if (id[i] == waterKing) 34 { 35 value += 2; 36 } 37 else 38 { 39 value -= 2; 40 } 41 } 42 } 43 else //当前水王不存在 44 { 45 if (id[i] == id[i + 1]) 46 { 47 waterKing = id[i]; 48 value += 2; 49 } 50 } 51 } 52 53 if (value > 0) // 对第一个id单独处理 54 { 55 if (id[0] == waterKing) 56 { 57 value++; 58 } 59 else 60 { 61 value--; 62 } 63 } 64 else 65 { 66 waterKing = id[0]; 67 value = 1; 68 } 69 } 70 else //偶数 71 { 72 for (int i = 0; i < num; i+=2) 73 { 74 if (value > 0) //水王存在 75 { 76 if (id[i] == id[i + 1]) 77 { 78 if (id[i] == waterKing) 79 { 80 value += 2; 81 } 82 else 83 { 84 value -= 2; 85 } 86 } 87 } 88 else //水王不存在 89 { 90 if (id[i] == id[i + 1]) 91 { 92 waterKing = id[i]; 93 value += 2; 94 } 95 } 96 } 97 } 98 99 if (value > 0) 100 { 101 cout << "水王ID为" << waterKing << endl; 102 } 103 else 104 { 105 cout << "没有水王!" << endl; 106 } 107 108 }
代码测试