一、题目
随着论坛的发展,管理员发现“水王”没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了总和的1/4。你能从发帖列表中快速找到他们吗?
二、设计思想
根据三个水王号的ID数均超过四分之一可以知道只要非水王号出现一次,水王号ID必定都对应会出现一次。则目前判断为水王号的ID出现则对应次数加一,非水王号出现一次则目前判断为水王号出现次数的均减一。运用这种算法则需要判断输入的ID号是否符合条件,通过判断最终判断出来的ID号的出现的次数之差可以判断出是否满足“发帖数量超过了总和的1/4”这一情况。
三、代码实现
1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 int a[1000000],length=-1,i;//a[1000000]用来存储每个帖子的作者ID,length用来记录帖子的数量 7 int b[3][2]; 8 bool flag=false; 9 //b[i][0]用来记录当前认为的“水王”的ID 10 //b[i][1]用来记录记录当前认为的“水王”相对于其他用户连续出现多出来的次数 11 12 //用于判断输入的数是否符合情况 13 while(length<1) 14 { 15 cout<<"请输入帖子的数量:"<<endl; 16 cin>>length; 17 } 18 19 cout<<"请依次输入每个帖子的作者ID:"<<endl; 20 for(i=0;i<length;i++) 21 { 22 cin>>a[i]; 23 } 24 //初始化第一个水王号 25 b[0][0]=a[0]; 26 b[0][1]=1; 27 //初始第二个水王号 28 for(i=1;i<length;i++) 29 { 30 if(a[i]!=b[0][0]) 31 { 32 b[1][0]=a[i]; 33 b[1][1]=1; 34 break; 35 } 36 else 37 { 38 b[0][1]++; 39 } 40 } 41 i++; 42 //初始第三个水王号 43 for(;i<length;i++) 44 { 45 if(a[i]!=b[0][0]&&a[i]!=b[1][0]) 46 { 47 b[2][0]=a[i]; 48 b[2][1]=1; 49 flag=true; 50 break; 51 } 52 else if(a[i]==b[0][0]) 53 { 54 b[0][1]++; 55 } 56 else 57 { 58 b[1][1]++; 59 } 60 } 61 i++; 62 //判断输入的ID至少有三个不同的ID号 63 if(flag==false) 64 { 65 cout<<"输入的ID号不符合条件!!!!"<<endl; 66 } 67 else 68 { 69 //根据三个水王号的ID数均超过四分之一可以知道只要非水王号出现一次,水王号ID必定都对应会出现一次 70 //目前判断为水王号的ID出现则对应次数加一,非水王号出现一次则目前判断为水王号出现次数的均减一 71 for(;i<length;i++) 72 { 73 if(b[0][1]==0&&a[i]!=b[1][0]&&a[i]!=b[2][0]) 74 { 75 b[0][0]=a[i]; 76 b[0][1]++; 77 } 78 else if(b[1][1]==0&&a[i]!=b[0][0]&&a[i]!=b[2][0]) 79 { 80 b[1][0]=a[i]; 81 b[1][1]++; 82 } 83 else if(b[2][1]==0&&a[i]!=b[1][0]&&a[i]!=b[0][0]) 84 { 85 b[2][0]=a[i]; 86 b[2][1]++; 87 } 88 else if(a[i]==b[0][0]) 89 { 90 b[0][1]++; 91 } 92 93 else if(a[i]==b[1][0]) 94 { 95 b[1][1]++; 96 } 97 else if(a[i]==b[2][0]) 98 { 99 b[2][1]++; 100 } 101 else if(a[i]!=b[0][0]&&a[i]!=b[1][0]&&a[i]!=b[2][0]) 102 { 103 b[0][1]--; 104 b[1][1]--; 105 b[2][1]--; 106 } 107 } 108 //避免出现误将不符合条件的情况输出 109 if(b[0][1]==0||b[1][1]==0||b[2][1]==0) 110 { 111 cout<<"输入的ID号不符合条件!!!!"<<endl; 112 } 113 else 114 { 115 if(max(max(b[0][1],b[1][1]),max(b[1][1],b[2][1]))-min(min(b[0][1],b[1][1]),min(b[1][1],b[2][1]))<(length/2-length/4-1)) 116 { 117 118 cout<<"第一个水王号为:"<<b[0][0]<<endl; 119 cout<<"第二个水王号为:"<<b[1][0]<<endl; 120 cout<<"第三个水王号为:"<<b[2][0]<<endl; 121 } 122 else 123 { 124 cout<<"输入的ID号不符合条件!!!!"<<endl; 125 } 126 } 127 } 128 return 0; 129 }
四、实现截图
实例一:ID号相对比较分散
实例二:ID号相对比较集中
实例三:ID号输入不满足情况
1、
2、
五、个人工作总结
这次实验是在前次寻找一个大水王的实验上的叠加,因此这次算法也是在上次算法的基础上的一个改进。上次是两个两个的比较,从而找到水王。这次实验只要抓住“三个水王号的ID数均超过四分之一”这一句话可以知道只要非水王号出现一次,水王号ID必定都对应会出现一次。则目前判断为水王号的ID出现则对应次数加一,非水王号出现一次则目前判断为水王号出现次数的均减一。刚开始没有考虑当水王号出现次数不满足条件“超过1/4”这个情况,在无意中某次输入实例三的情况1时,任显示有水王号,最后通过找到水王号出现次数之差的临界值,即ID号数量/2-ID号数量/4-1,当不小于这个临界值时,输入的ID号不满足条件。
通过这次实验,我自己通过边界测试来查找自己编写的代码的错误,让我对边界测试的实例选择有了实际体验,相信在以后的实验我可以更好地运用边界测试找到自己编写的算法的缺陷。