天天看点

课堂练习—找水王之小水王

  一段时间之后,大水王消失了,出现了三个小水王,他们每一个人发帖数超过了总数的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进行替换,然后按照此方法循环三次,即可将三个水王全部求出,但是,这种方法对三个水王发帖数相同时,却计算不出来。所以没有采用此方法。

时间记录日志:

课堂练习—找水王之小水王