思路:
水王的发帖量都超过1/2,假设水王的ID为开始第一个发帖人的id,则开始遍历发帖人的id,如果相同则n+1,如果不同则n-1,因为水王的发帖量超过1/2,则n到最后也是大于0的。
步骤:
1. 可以假设帖子的第一个id是次数最大的,用ID记录,次数用n记录。
2. 遍历下一个ID,如果跟ID一样,n++,否则,遇到一个挑战,则n--,如果n == 0,下一步就要重复第一步了。
3.遍历结束,n>0的那个ID就是水王id,他是水王。
同理三个水王的问题也可以如此。
源代码:
#include <iostream> using namespace std; void main() { int i,n[3]={0},id[20],ID[3]={0};//n是记录水王id的遍历次数,ID是假设的水王id,id是发帖人id cout<<"请输入发帖人id:"<<endl; for(i=0;i<20;i++) { cin>>id[i]; } for(i=0;i<20;i++) {//假设第一个id是水王 if(id[i]==ID[0]) { n[0]++; } else if(id[i]==ID[1]) { n[1]++; } else if(id[i]==ID[2]) { n[2]++; } //重新开始给ID赋值 else if(n[0]==0) { n[0]=1; ID[0]=id[i]; } else if(n[1]==0) { n[1]=1; ID[1]=id[i]; } else if(n[2]==0) { n[2]=1; ID[2]=id[i]; } //假设错误则记录数减一 else { n[0]--; n[1]--; n[2]--; } } cout<<"三个小水王id分别是:"<<ID[0]<<","<<ID[1]<<","<<ID[2]<<endl; }
截图:
总结:
我们在解决问题时,要先找到问题的关键,就像水王问题一样,水王的发帖量超过一半,那么我们就可以从这个方向入手,先假设水王的id为ID计数n为0,给他赋值和其他id比,如果相同,则n+1,如果不同则删除这两个id,因为水王的发帖量超过一半,因此剩下的一定是水王的id,同理三个水王问题其实就是大水王的问题,不要被表面的问题所迷惑,要透过表面看本质。