• 课堂练习-找水王


    一、题目及题目要求

    题目:三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
    如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?

    二、设计思路:

    1、把帖子列表,抽象为一个一维数组arr[NUM],输入长度length为id总数,每个数组元素为一个id。

    2、再设置一个循环,按照顺序来依次两两比较,如果作者id相同则保留,如果作者id不同则消除。

    3、最后剩下id即为水王id

    三、源程序:

    #include<iostream>
    using namespace std;
    #define NUM 100
     int find(int arr[], int n)//找水王函数
     {
        int sw = 0; //
        int count=0;  //标记
        for(int i=0;i<n;i++)
        { 
            if(count == 0)//初始时,把数组第一个元素赋给sw
            { 
                sw = arr[i]; 
                count = 1; 
            } 
            else
            { 
                if(sw == arr[i]) //相等不消除
                    count ++; 
                else  
                    count --; 
            } 
        }
    
             return sw;
        }
    int main()
    {
    	  int length=0;
          while (length==NULL||length == 0)//如果数组长度为空或零则请重新输入
          {
            cout<<"请输入ID数量:";
            cin>>length;
           }
           int arr[NUM];
           cout<<"输入作者id(不为0):"<<endl;
    	   for(int i=0;i<=(length-1);i++)
    	   {
    		   cin>>arr[i];
    		   if(arr[i]==0)
    		   {
    			   cout<<"id不为0,请重新输入:";
    		   cin>>arr[i];
    		   }
    
    	   }
    
    	   int ID=find(arr,length);
    		cout<<"水军的ID是"<<ID<<endl;
    		return 0;
    }
    

    四、运行截图

    五、项目计划日志

    周活动总结表

    姓名:魏**                  日期2016.5.19

    日期   任务 听课  编写程序 阅读课本 准备考试     日总计

    周一

    100   30       130

    周三

        30       30

    周四

      100         100

    周总结

    100 100 60       260

    阶段时间和效率                                            周数(上一次周活动表的周数+1):

    不包括上一周在内的累计时间      

    总计

     100

     100

     60

     

     

     

     260

    平均

     100

     100

     60

     

     

     

     260

    最大

     100

     100

     60

     

     

     

     260

    最小

     100

     100

     60

     

     

     

     260

     以前各周的累计时间      

    总计

     100

     100

      60

     

     

     

     260

    平均

     100

    100

      60

     

     

     

     260

    最大

     100

    100

     60

     

     

     

     260

    最小

     100

    100

     60

     

     

     

     260

    六、时间记录表:

    学生       魏**                                           日期   2016年5月19日 

    教师        王**                                          课程        软件工程      

    日期

    开始时间

    结束时间

    中断时间

    净时间

    活动

    备注

     5.16

     14:30

    16;20 

    10

     100

     上课

     

     5.16

     18:30

     19:00

     无

    30

    看书

     

     5.18

    22:00

    22:30

     无

    30

    看书

     

     5.19

    14:30

    16:30

    100

    编写程序

    作业

     

    七、个人总结

    这个题目,一开始没有思路,在老师的启发下一开始到的是遍历列表,统计每个id出现的次数。后来老师提到了遍历然后排序,中间项肯定是水王ID,可是时间复杂度为n*n,为了降低时间复杂度,老师提示用两两消除的思想,后来我们就想到了如何解决。一道题目有好多种解法,我们应当拓宽思路,多看一些算法书籍,多练习写程序,孰能生巧。

  • 相关阅读:
    c++ 析构函数
    define 全局变量 extern
    C 与 python 的随机数
    WinMain function can not be oveloaderd
    宽字符编码与多字节编码
    windows 静态库 与 动态库
    extern C 语言中
    ubuntu 修改分辨率 , 虚拟机中的ubuntu联网
    main(int argv, char* argc[])
    数字分隔符,三位一个逗号
  • 原文地址:https://www.cnblogs.com/a1397240667/p/5509088.html
Copyright © 2020-2023  润新知