zoukankan      html  css  js  c++  java
  • 软件工程课堂作业——寻找水王2

     一、题目

      随着论坛的发展,管理员发现“水王”没有了,但是统计结果表明,有三个发帖很多的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号不满足条件。

      通过这次实验,我自己通过边界测试来查找自己编写的代码的错误,让我对边界测试的实例选择有了实际体验,相信在以后的实验我可以更好地运用边界测试找到自己编写的算法的缺陷。

  • 相关阅读:
    天梯赛5-12 愿天下有情人都是失散多年的兄妹 【dfs】
    poj2718 Smallest Difference【贪心】
    HDU problem 5635 LCP Array【思维】
    codeforces 782C Andryusha and Colored Balloons【构造】
    HDU 4278 Faulty Odometer【进制转换】
    codeforces B. The Meeting Place Cannot Be Changed【二分】
    POJ 3264 Balanced Lineup 【线段树】
    HDU 1850
    CodeForces-714C
    HDU Problem 1247 Hat's Words 【字典树】
  • 原文地址:https://www.cnblogs.com/chengqiqin07/p/5533726.html
Copyright © 2011-2022 走看看