课堂练习—找水王之小水王
一段时间之后,大水王消失了,出现了三个小水王,他们每一个人发帖数超过了总数的1/4.
要求:如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这三个小水王吗?
解决方法:
对所面临的问题进行简化,由于三个小水王发帖数均超过了总数的1/4,可以仿照求大水王的算法,进行解决。可以四个一组来进行相消,将三个小水王看成三组,其它的看成一组,由与三个小水王的发帖数均超过1/4,四个一组进行相消后,剩下的就是三个小水王。
代码:
//找水王扩展 //李妍 20133093 //找水王扩展,即大水王已经消失,出行三个小水王,并且每个水王发帖数目都已超过总帖子数的1/4,找出这三个小水王。 #include<iostream> using namespace std; #define N 100 int main() { int Water_King[3] = { 0 }; //用来标记水王 int num[3] = { 0 }; //记录消除后的对应水王的个数 int num_tiezi;//记录帖子的数目 int Tie[N]; cout << "请输入帖子的数目:"; cin >> num_tiezi; while (num_tiezi == 0)// { cout << "帖子的数目不能是0,请重新输入:"; cout << endl; cin >> num_tiezi; } cout << "输入帖子ID:" << endl; for (int i = 0; i <= (num_tiezi - 1); i++) { cout << "("<<i+1<<"):"; cin >> Tie[i]; while (Tie[i] == 0)//if只进行一次判断,while能进行多次判断 { cout << "ID不能为0,请重输:"; cout << "(" << i + 1 << "):"; cin >> Tie[i]; cout << endl; } } //进入循环,寻找水王。 for (int i = 0; i<num_tiezi; i++) { //如果num[i]等于0,则表示对应的水王没有赋值,需要对它进行赋值,在赋值的过程中,为避免重复标记形同的ID,对其判断。 if (num[0] == 0)//对水王1进行赋值 { if (Water_King[1] == Tie[i]){ num[1]++; } else if (Water_King[2] == Tie[i]){ num[2]++; } else{ Water_King[0] = Tie[i]; num[0]++; } } else if (num[1] == 0)//对水王2进行赋值 { if (Water_King[0] == Tie[i]){ num[0]++; } else if (Water_King[2] == Tie[i]){ num[2]++; } else{ Water_King[1] = Tie[i]; num[1]++; } } else if (num[2] == 0)//对水王3进行赋值 { if (Water_King[0] == Tie[i]){ num[0]++; } else if (Water_King[1] == Tie[i]){ num[1]++; } else{ Water_King[2] = Tie[i]; num[2]++; } } //三个水王都已赋值,计算对应水王的个数,如果该Tie[i]于三个水王的值不一样,则进行相消。 else{ if (Tie[i] == Water_King[0]){ num[0]++; } else if (Tie[i] == Water_King[1]){ num[1]++; } else if (Tie[i] == Water_King[2]){ num[2]++; } //进行相消。 else{ num[0]--; num[1]--; num[2]--; } } } for (int i = 0; i < 3; i++) { cout << "第"<<i+1<<"个水王的ID是:" << Water_King[i] << endl; } return 0; }
测试结果:
试验总结:该试验可以采用类比对照的方法进行解决,只有一个水王的时候可以两两进行相消,对于有三个水王时,可以四个一组进行相消,找到突破口,将问题简化,在开始的时候也考虑到,先求一个水王,求出后,对它的ID进行替换,然后按照此方法循环三次,即可将三个水王全部求出,但是,这种方法对三个水王发帖数相同时,却计算不出来。所以没有采用此方法。
时间记录日志: