寻找水王程序一

题目 :

信息学院的论坛里面,有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。风闻该“水王”发帖数目超过了帖子总数的一半。

如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能怎么样找出这个传说中的Tango水王吗?

思路:

我开始想到的思路是:

可以假设帖子的第一个ID是次数最大的。 遍历下一个ID,如果跟第一个一样,就++,否则,遇到一个不是水王发的帖子,将这个帖子与水王发的一个帖子删掉,也就是--,如果 == 0,那么说明当前的候选不是水王,假设下一个是新的水王。遍历结束,剩下就是水王ID,他是获胜者。 

按老师的思路:

每次抵消两个相邻的ID,不管删除的ID是否包含“水王”的ID,在剩下的ID列表中,“水王”ID出现的次数仍然超过总数的一半。可以通过不断重复这个过程,把ID列表中的ID总数降低(转化为更小的问题),从而得到问题的答案。总的时间复杂度只有(N),且只需要常数的额外内存。

#include <iostream>
using namespace std;

typedef int Type;

Type find (Type *a, int N)
{
	Type sw;
	int i, nTimes;
	for (i = nTimes = 0; i < N; i++)
	{
		if (0 == nTimes)
		{
		    sw  = a[i];
			nTimes = 1;
		}
		else
		{
			if (sw == a[i])
			{
				nTimes++;
			}
			else
			{
				nTimes--;
			}
		}
	}
	return sw;
} 

int main()
{
	int sw;
	Type arr[] = {4, 5, 4, 4, 4, 5, 0, 2, 4, 2, 4, 4};
	sw=find(arr,12);
    cout<<"水王是:"<<sw;
	return 0;
}

时间: 2024-10-24 19:59:26

寻找水王程序一的相关文章

寻找水王程序二

题目: 在上一次的程序中 信息学院的论坛里面,有一大“水王”不见了.出现了三个小水王,每个人的发帖数都超过了1/4. 思路: 还是上次消除的思想,我定义了三个计数器和三个初始嫌疑水王,比较三个ID,如果不相同,就排除,如果相同,那么计数器加一.嫌疑水王ID都与其它水军ID进行消除最后剩下的就是三个水王. 代码: #include "iostream" using namespace std; typedef int Type; Type find(Type *shuiwang ,int

课堂作业值之寻找水王2

随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗 设计 思想: 与上次寻找水王一样,这次将与三个水王不同的ID都消除掉,剩下的就是三个水王的ID 程序源代码: import java.util.Scanner;public class shuiwang2 { public static void main(String args[]) { Scanner scanner=new Scanner(Syst

寻找水王

一.设计思路 1.我采用的方法是两两计算抵消的想法,相邻的两个ID依次比较. 2.计数器用来表示水王出现的次数.默认当计数器为0时,水王就是当前的ID,因此水王出现一次,计数器从0加1,然后比较后一个ID,如果相同,意味着水王又出现一次,计数器就自加1:如果不同,意味着水王没有出现第二次,直接抵消,计数器就减1.当计数器为0,水王又是当前ID,依次循环. 二.代码 //2016/5/18 信1301-1 黄山成 20133048 寻找水贴王的ID #include<iostream> usin

寻找水王续

一.题目要求 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4, 你能从发帖列表中快速找到他们吗? 二.设计思路 这次是求3个ID,而且他们发帖数各超过了总数的四分之一,所以再次用上次寻找水王实验的思想,消除不同ID号,只不 过得设置3个标记,复杂一点,可用数组表示. 三.代码 #include<iostream.h> void ID_array(int l,int A[]) { cout<<"请输入ID序列:

寻找水王01

设计思想: 每次从ID列表中删除两个不同的ID,不影响“水王的ID在剩余ID中仍然超过一半”这一事实,因此每次删除两个不同的ID,直到剩下的所有ID都相同,那么剩下的就是水王的ID.不断重复这个过程,时间复杂度为O(n). 具体实现: 具体编程的时候,使用一个candidate记录当前猜测的水王ID,一个count记录其累计次数,然后遍历整个ID列表,对于当前所考查的ID,如果和candidate相同,那么count++,如果不同,那么count--,这个“count--;”的动作就是“删除两个

软件工程课堂作业——寻找“水王”

一.题目 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 二.设计思想: 由于该“水王”发帖数目超过了帖子数目的一半,可以通过相邻两个帖子的作者ID是否相同来寻找.如果相邻两个ID不同,则将两个ID略过:若相等,则判断之前是否有怀疑是“水王”的ID,如

软件工程随堂小作业—— 寻找“水王”(C++)

一.设计思路 (1)输入发帖ID记录表 (2)从第一个ID开始,与后续的发帖ID进行比较,若相同计数器则加一,否则减一.若计数器的数值被减为零,则重新选取当前ID开始记录比较. (3)输出结果 二.源代码 1 // shuiwang.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 #include "iostream.h" 6 #def

课堂练习——寻找水王

一,题目 •三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. •如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 二,思路 思路1:因为各个人的id号大小不同,因此可将所有人的id号按照从小到大的顺序进行排序,用快速排序法,时间复杂度为:O(N*logN).然后遍历整个数组,统计每个id号出现的次数,出

课堂作业之寻找水王

•三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. •如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 程序设计思想: 将两两不同的id号相抵消,剩的就只能是水王了 程序源代码实现 import java.util.Scanner; public class shuiwang{ public stati