码迷,mamicode.com
首页 > 其他好文 > 详细

4月21号周二课堂练习:找水王

时间:2015-04-21 22:23:31      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

一、题目要求

三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
 
二、设计思路
 
论坛中有多少帖子,有多少个ID都是不清楚的。我们采用类似于消消乐的方法进行处理,具体方法如下:将所有的帖子进行遍历,比较两个帖子的ID。如果两个帖子的ID相同,则将两个帖子丢弃。再进行下次比较,直到剩余的帖子中的ID只有一种,将此ID输出,即为要找的“水王”。
 
三、程序源代码
#include<iostream>
using namespace std;
int curId=0;//当前灌水id
int idNum=0;//当前灌水id的数量

void deal(int arr[],int n)
{
	for (int i=0;i<n;i++)  
	{  
		if (idNum==0) //当前灌水的id数量变为0或者抵消成为了0
		{  
			idNum++;//灌水帖子数量+1
			curId=arr[i];//用curId记录当前灌水Id
		}  
		else  
		{  
			if(curId==arr[i])//如果新的灌水帖子与当前帖子Id相同则Id数量+1
				idNum++;  
			else  //如果不同,则抵消一个当前Id      
				idNum--; 
		}  
	}  
}  
void main()
{
	int i;
	int count=0;//记录水王的帖子数量
	int n;//灌水帖子数
	int * arr=new int[n];
	cout<<"请输入灌水帖子数:";
	cin>>n;
	cout<<"输入每个灌水帖子id:"<<endl;
	for(i=0;i<n;i++)
	{
		cin>>arr[i];
	}
	deal(arr,n);
	for(i=0;i<n;i++)
	{
		if(arr[i]==curId)
		{
			count++;
		}
	}
	cout<<"\"水王\"Id是:";
	cout<<curId<<endl;
	cout<<"水贴数量为:";
	cout<<count<<endl;
}

 

四、运行截图

当ID是数字时可以正常处理

技术分享

当ID是字母或字符时会出现如下错误

技术分享

 

五、实验总结

实验做完之后还有很多的后续工作要做,算法优化和灌水帖的ID都是要解决的问题。仔细分析后会发现,题目说了一大堆的废话,其实给我们传达的就只有三点信息,1、求一个数组的最大值;2、最大值大于数组所有数和的一半;3、找到这个最大值并将数组的位置输出(即ID)。这题的难点主要是在算法的时间复杂度上。本题还有待改进在时间复杂度和 帖子的id处理上面。

4月21号周二课堂练习:找水王

标签:

原文地址:http://www.cnblogs.com/huangxiaofei/p/4445370.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!