随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?
设计思路:
概要:三个小水王占总帖子数目的3/4以上,采用变形的二并法
定义int shui【3】,存储小水王,在定义int num【3】,记录三个小水王出现的次数,将帖子中前三个贴主赋值给shui[3],num【3】初始为0。For循环从第四个帖子开始循环,结束条件,所有的帖子都运算了一次。循环体:判断发帖人是否与shui[3]中相同,如果是,则对应的num【i】++,否则判断是否有num【i】小于0,如果有,则将该发帖人赋值给shui【i】,如果num【i】中没有小于0的数,则所有的num【3】都--,此时判断是否有num【i】小于0,如果有,则将该发帖人赋值给shui【i】
循环结束后,shui[3]中的值就是三个小水王。。
代码实现:
1 //陈昌 20143051 2 //2016/05/24 找水王续 3 #include<iostream> 4 #include<string> 5 using namespace std; 6 void main() 7 { 8 string shui[3];//存储水王 9 int num[3];//记录嫌疑水王的出现的次数 10 int NUM; 11 cout<<"请输入:"; 12 cin>>NUM; 13 string *tie = new string[NUM];//这部分用于从键盘中输入发帖人 14 //string tie[12]={"a","a","a","a","b","b","b","b","c","c","c","c"}; 15 for(int i=0;i<NUM;i++) 16 { 17 cout<<"输入"<<i+1<<"号贴主名:"; 18 cin>>tie[i]; 19 }//这部分用于从键盘中输入发帖人 20 21 for(int i=0;i<3;i++)//初始化 22 { 23 shui[i]=tie[i]; 24 num[i]=0; 25 } 26 27 for(int yi=3;yi<12;yi++)//运算 28 { 29 bool piPei=false;//用于判断是否下一个是否匹配 30 for(int er=0;er<3;er++)//循环匹配判断 31 { 32 if(shui[er]==tie[yi]) 33 { 34 num[er]++; 35 piPei=true; 36 break;//匹配,停止循环 37 } 38 } 39 if(!piPei)//匹配不成功 40 { 41 bool er=false;//只替换一个shui 42 bool san=false;//用于判断是否有num【i】<0,有的话直接替换 43 for(int liu=0;liu<3;liu++) 44 { 45 if(num[liu]<0) 46 san=true; 47 } 48 if(!san)//没有num【i】<0,所有的num-- 49 { 50 for(int san =0;san<3;san++) 51 num[san]--; 52 } 53 for(int si=0;si<3;si++) 54 { 55 if (num[si]<0&&er==false)//只替换一个shui 56 { 57 shui[si]=tie[yi]; 58 num[si]=0; 59 er=true; 60 } 61 } 62 } 63 } 64 for(int wu=0;wu<3;wu++)//输出小水王 65 { 66 cout<<wu+1<<"号小水王:"<<shui[wu]<<endl; 67 } 68 }
结果截图:
个人总结:
虽然一开始想到了主要的解题思路,而且也写出了设计思路,但是实际操作起来发现,然并卵,错了,此事并没有停下了整理思路,而是一个劲的寻找错误,到处设立断点,结果然并卵,自己看不下去;于是采用输出语句判断错误,经过一番周折,最终解决了,还是设计思路的问题。。。