zoukankan      html  css  js  c++  java
  • 寻找水王程序一

    题目 :

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

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

    思路:

    我开始想到的思路是:

    可以假设帖子的第一个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;
    }
    

     

  • 相关阅读:
    HTML5-拖拽
    POJ1182食物链(并查集)
    欧拉函数之HDU1286找新朋友
    Another kind of Fibonacce(矩阵快速幂,HDU3306)
    我的第一道java_A+B
    bestcoder#33 1002 快速幂取余+模拟乘,组合数学
    快速幂模版
    bestcoder#33 1001 高精度模拟
    poj2446_二分图
    poj3984_bfs+回溯路径
  • 原文地址:https://www.cnblogs.com/tyyhph/p/5498807.html
Copyright © 2011-2022 走看看