标签:
随着Tan-go的发展,发现,“超级水王”没有了。统-计结-果表-明,有3个发帖很多的ID,他们的 数目都超过了 总数目N的1/4。你能从 ID列表中快速找出他们的ID吗?
题目的前提条件是3个水王,他们 数都超过了总数1/4,根据上次找水王的思想这次也借用消消乐的想,每次删去4个不同的id,剩下的一定还是符合3个水王的发-帖数都超过1/4;
找到一个不为0的id保存其位置,然后找到第二个不为0且不与第一个相同的id的位置,依次类推,找到第四个。然后把四个赋值为0.循环执行上面的过程,知道剩余的id都是水王的id为止。
#include <iostream.h> int find(int id[],int length)//把刚才写的封装成一个函数,以便于多次调用 { int true1=1; int xiaoa=0; int xiaob=0; int xiaoc=0; int xiaod=0; int n1=0; int n2=0; int n3=0; int n4=0; for(int i=0;i<length;i++) { if(id[i]!=0)//不等于0 { xiaoa=id[i]; n1=i; i=length; } } for(i=0;i<length;i++) { if((id[i]!=0)&&(id[i]!=xiaoa)) { xiaob=id[i]; n2=i; i=length; } } for(i=0;i<length;i++) { if((id[i]!=0)&&(id[i]!=xiaoa)&&(id[i]!=xiaob)) { xiaoc=id[i]; n3=i; i=length; } } for(i=0;i<length;i++) { if((id[i]!=0)&&(id[i]!=xiaoa)&&(id[i]!=xiaob)&&(id[i]!=xiaoc)) { xiaod=id[i]; n4=i; i=length; } } //cout<<xiaoa<<" "<<xiaob<<" "<<xiaoc<<" "<<xiaod<<endl; //让他们都等于0 //xiaoa=xiaob=xiaoc=xiaod=0; id[n1]=id[n2]=id[n3]=id[n4]=0; return 0; } int main(void) { int id[13]={1,2,2,2,2,3,4,3,3,3,4,4,4}; //find(id,13); //一直重复上面的函数find代码直到数组里面没有四个不同的为止,也就是只剩下3个水王 int n;//重复的次数 int sum;//这个帖子总共有多少条 cout<<"输入总共总共有多少条:"; cin>>sum; n=sum%3; //cout<<n<<endl; for(int j=0;j<n;j++) { find(id,sum); } //把数组中的重复的水王id去掉 //循环把所有数组里面不是0的数输出,就是3个水王 for(int i=0;i<13;i++) { if(id[i]!=0) cout<<id[i]<<" "; } cout<<endl; cout<<"结果中只有3个,都是水王的id;这个程序还要优化结果输出,和时间复杂度"<<endl; return 0; }
四、结果截图
五、实验总结
本次练习是在上一次的基础之上进行的,上次采用的是消消乐思想,但是这次是三个水王,要是还采用和上次一样的思想来解决问题就会遇到问题,后来在和同学的交流和老师的指引下找到了思路也就是上次思路的扩展。通过这次练习知道一种思路可以有很多扩展,也就是典型的举一反三,扩展后可以解决就很多相似的问题,思路的扩展是以后要锻炼的方向。
标签:
原文地址:http://www.cnblogs.com/hushunli/p/4461578.html