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

寻找论坛小水王算法

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

时间记录日志:

转载于:https://www.cnblogs.com/liyan-luckygirl/p/5535770.html

### 关于水争霸编程竞赛 #### 水争霸 C语言 编程竞赛概述 水争霸是一项面向广大程序员和爱好者的编程挑战赛,旨在通过解决实际问题来提升参赛者的技术水平。比赛通常会提供一系列具有不同难度级别的题目供选手解答。 对于C语言编程竞赛而言,参与者需运用标准C/C++库编写程序解决问题[^1]。上述给出的代码片段展示了如何处理交通信号灯的时间逻辑,在比赛中类似的算法设计能力是非常重要的。 #### 规则说明 - **环境准备**:确保拥有支持C/C++编译器的工作站或在线平台。 - **提交形式**:按照官方指定的方式上传源码文件,注意遵循命名约定。 - **测试案例**:除了自行构建的数据集外,还需考虑边界条件以及异常情况下的表现。 - **评分机制**:依据运行效率、内存占用等因素综合评定成绩;部分赛事可能还会考察代码可读性和文档质量。 #### 参与方式指导 为了参加此类活动,建议关注各大高校社团公告栏或是知名技术社区发布的消息通知。许多时候这类竞赛是由特定机构主办并开放报名链接给公众注册加入。另外也可以留意社交媒体上的宣传帖文获取最新动态。 ```c++ // 示例:简单的输入输出练习题 #include <iostream> using namespace std; int main(){ int num; cout << "请输入一个整数:" ; cin >> num; cout << "您输入的是:" << num << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值