软件工程课堂练习找水王

  • 题目
  三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
  • 要求

  如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?

 

  • 思路

  由于题目已经告诉我们水王的帖子数目超过了帖子总数的一半,所以对帖子做如下处理:

  1. 如果相邻两帖子ID不同,则抵消,不做其他处理。
  2. 如果相邻两帖子ID相同,则为嫌疑水王。再和当前水王比较,若和当前水王相同,当前水王水的可能性+2;若和当前水王不相同,当前水王水的可能性-2;若当前没有水王,那么嫌疑水王就做为水王。
  3. 如果当前水王水的可能性>0,那么就是水王,如果当前水王水的可能性=0,那么当前水王也就不是水王,再返回1。
  4. 最后的当前水王且水的可能性>0,那么他就是水王,否则没有水王。

 

   对帖子数的奇偶分别处理,奇数的话单独对第一个id进行处理,偶数不做处理。

 

  1 #include <iostream>
  2 using namespace std;
  3 int main()
  4 {
  5     int id[1000];    //发帖ID
  6     int waterKing;     //当前水王
  7     int value = 0;        //当前水王水的可能性
  8     int num;       //帖子数
  9     cout << "请输入帖子数:";
 10     cin >> num;
 11     if (num <= 0)
 12     {
 13         cout << "非法的输入";
 14         exit(1);
 15     }
 16 
 17     cout << "请输入发帖的ID:" << endl;
 18     for (int i = 0; i < num; i++)
 19     {
 20         cin >> id[i];
 21     }
 22 
 23     if (num % 2)    //奇数
 24     {
 25         /*waterKing = id[0];
 26         value = 1;*/
 27         for (int i = 1; i < num; i+=2)
 28         {
 29             if (value > 0)     //当前水王存在
 30             {
 31                 if (id[i] == id[i + 1])
 32                 {
 33                     if (id[i] == waterKing)
 34                     {
 35                         value += 2;
 36                     }
 37                     else
 38                     {
 39                         value -= 2;
 40                     }
 41                 }
 42             }
 43             else             //当前水王不存在
 44             {
 45                 if (id[i] == id[i + 1])
 46                 {
 47                     waterKing = id[i];
 48                     value += 2;
 49                 }
 50             }        
 51         }
 52 
 53         if (value > 0)    // 对第一个id单独处理
 54         {
 55             if (id[0] == waterKing)
 56             {
 57                 value++;
 58             }
 59             else
 60             {
 61                 value--;
 62             }
 63         }
 64         else
 65         {
 66             waterKing = id[0];
 67             value = 1;
 68         }
 69     }
 70     else         //偶数
 71     {
 72         for (int i = 0; i < num; i+=2)
 73         {
 74             if (value > 0)     //水王存在
 75             {
 76                 if (id[i] == id[i + 1])
 77                 {
 78                     if (id[i] == waterKing)
 79                     {
 80                         value += 2;
 81                     }
 82                     else
 83                     {
 84                         value -= 2;
 85                     }
 86                 }
 87             }
 88             else            //水王不存在
 89             {
 90                 if (id[i] == id[i + 1])
 91                 {
 92                     waterKing = id[i];
 93                     value += 2;
 94                 }
 95             }
 96         }
 97     }
 98 
 99     if (value > 0) 
100     {
101         cout << "水王ID为" << waterKing << endl;
102     }
103     else
104     {
105         cout << "没有水王!" << endl;
106     }
107     
108 }

 

 代码测试

http://www.cnblogs.com/xiaoxt/p/5511005.html

转载于:https://www.cnblogs.com/xiaoxt/p/5508849.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值