扩展问题
扩展问题中,有3个发帖水王超过帖子总数N的1/4,请找出这3个水王。
个人解法
1设置备选组3个 candidate[3]
2设置计数组3个 nTimes[3]
3每次若没有出现 candidate[j],则nTimes[j]-=1/3.0;
为什么呢?
假设某贴王发帖数超过总数的1/K倍,设若每次没有出现他发的贴则减去1/T;一共有N个帖子。
则:X>=(N-x)/T;即出现贴王一次,要+1,没出现一次-1/T,最后的权值(nTimes)要大于等于0
则:x>=N/(T+1);即K=T+1;书中K=2,则T=1,扩展问题中K=4,则T=3.0;
附上C++代码如下:
// 2.3.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> using namespace std; void Find(int ID[],int N); int ID[20]={1,1,1,3,2,1,11,2,3,3,4,2,3,6,2,2,3,1,2,1};//代表发帖人的ID //int ID[20]={1,1,1,1,1,1,3,4,5,6,7,8,9,10,11,12,13,14,15}; int _tmain(int argc, _TCHAR* argv[]) { Find(ID,20); return 0; } void Find(int ID[],int N)//有3个人发帖超过总数的0.25N { int candidate[3]; int i,j; double nTimes[3]={0,0,0}; bool label=true; for(i=0;i<N;i++) {label=true; for(j=0;j<3;j++) { if(nTimes[j]!=0 & candidate[j]==ID[i]) { nTimes[j]+=4/3.0;//因为后面要统一减 1/3,所以这里要加4/3 label=false;//如果下个数字与candidate重复则,不进行下面的循环。 break; } } if(label) { for(j=0;j<3;j++) { if(nTimes[j]<=0) { candidate[j]=ID[i]; nTimes[j]=4/3.0;//因为后面要统一减 1/3,所以这里要加4/3 break; } } } for( j=0;j<3;j++) { nTimes[j]-=1/3.0; } } for(j=0;j<3;j++) cout<<candidate[j]<<endl; }
注:问题是有前提的,有3个发帖水王超过帖子总数N的1/4。
本人水平有限,怀着分享学习的态度发表此文,欢迎大家批评,交流。感谢您的阅读。
欢迎转载本文,转载时请附上本文地址:http://www.cnblogs.com/Dzhouqi/p/3360015.html
另外:欢迎访问我的博客 http://www.cnblogs.com/Dzhouqi/