找水王扩展

一、题目

  随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗

二、设计思路

  原来问题的求解,是超过半数的水王,现在变成超出1/4,那么剩下的就不会超过1/4,由此可以分析,如果每次比较,去除其中不相同的三个数据,那么,跟去除找到其中超过1/2的ID数的解法是一样的,所以,我们可以设置一个数组来存储三个不相同的ID,然后从waterking列表中找出与这三个匹配的ID,如果匹配的话,那么计数标志single[]+1,如果不匹配,所有ID的标志位-1,那么到最后剩下的肯定是数量最多的三个ID

三、源代码(在原来基础上进行改进)

 1 // waterking.cpp : 定义控制台应用程序的入口点。
 2 //
 3
 4 #include "stdafx.h"
 5 #include"iostream"
 6 using namespace std;
 7
 8 void Data(int length,int A[])
 9 {
10     cout<<"请输入符合条件的ID列表(其中三个ID的数量分别超过1/4,其他的ID少于1/4):"<<endl;
11     for(int i=0;i<length;i++)
12     {
13         cin>>A[i];
14     }
15 }
16
17 int main()
18 {
19     int length;
20     int single[3]={0,0,0};
21     int ID[3]={-1,-1,-1};        //设置信号量
22     cout<<"请输入帖子数量:";
23     cin>>length;
24     int * waterking=new int [length];
25     Data(length,waterking);
26     for(int i=0;i<length;i++)
27     {
28         /*先将ID列表初始化,找出三个不同的ID*/
29         if(single[0]==0 && waterking[i]!=ID[1] && waterking[i]!=ID[2])
30         {
31             single[0]=1;
32             ID[0]=waterking[i];
33         }
34         else if(single[1]==0 && waterking[i]!=ID[0] && waterking[i]!=ID[2])
35         {
36             single[1]=1;
37             ID[1]=waterking[i];
38         }
39         else if(single[2]==0 && waterking[i]!=ID[0] && waterking[i]!=ID[1])
40         {
41             single[2]=1;
42             ID[2]=waterking[i];
43         }
44         /*开始进行查找,不同标志single+1,相同标志-1*/
45         else if(waterking[i]!=ID[0] && waterking[i]!=ID[1] && waterking[i]!=ID[2])
46         {
47             single[0]--;
48             single[1]--;
49             single[2]--;
50         }
51         else if(waterking[i]==ID[0])
52         {
53             single[0]++;
54         }
55         else if(waterking[i]==ID[1])
56         {
57             single[1]++;
58         }
59         else if(waterking[i]==ID[2])
60         {
61             single[2]++;
62         }
63
64     }
65     cout<<"水王为:"<<ID[0]<<ID[1]<<ID[2]<<endl;
66     return 0;
67 }

四、实验结果

五、实验结果分析

  许多问题都是有共同点的,如果我们能够找到几个问题的共同点,那么,如果可以解决一个问题,就可以解决多个问题,就不用再去重新审视问题分析问题了,只需要在原来的基础上进行拓展就可以了,就像这次的找水王,找一个和找三个的其实没有什么区别,一个人发帖数超过一半,3个人发帖数超过1/4,那么3个人加起来也超过了一半,如果将三个人看成一个整体,那么跟一个人的时候就成了一样的问题。

  所以,在解决问题时,我们不妨先做分析,要解决的问题跟某个问题相似或者原理相同,而这个问题是怎样解决的,要解决的问题应该进行怎样的转化,就可以跟这个问题一样了。如果我们能够正确的分析问题,最后的结果肯定事半功倍,节省大量的时间

时间: 2024-10-08 10:21:24

找水王扩展的相关文章

找水王(二)

一.题目 一段时间之后,大水王消失了,出现了三个小水王,他们每一个人发帖数超过了总数的1/4. 要求:如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这三个小水王吗? 二.解题思路 将第一次找水王的套路扩展一下,每次删除四个不同的结点,最后就能得到三只水王 三.程序代码 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main() 5 { 6 //建立数

软件工程——找水王(续)

一.题目 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗 二.设计思路 参考原来问题的解法,如果每次删除4个不同的ID(不管是否超过总数1/4的ID),那么,剩下的ID列表中,原先发帖比例大于1/4的ID所占比例仍然大于1/4.可以通过不断重复这个过程,把ID总数降低,从而得到问题的答案.具体方法:用candidate[3]记录三个候选ID,用count[3]记录它们的累积次数,然后遍历整个ID列表,

找水王 多个水王

package Arraysum; public class FindWaterKing { public static void main(String[] args) { //把id列表放到一个数组里面 int[] idNum = {1,1,1,1,12,3,11,1,1,15,6,6,77,1,1,1,1}; //指向前一个数和后一个数的指针 int previor = 0; int next = 1; //通过while循环来实现两两相消法 while((previor < idNum.

课堂练习—找水王之小水王

三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 要求:如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 解决方法: 对所面临的问题进行简化,由于“水王”发帖数目超过了帖子数目的一半,由此可以作为突破口,寻找简单的方法,来解决,可以将发帖的ID看成一位数组,简化 为,在一位数组中,查找一半以上相同的元素

找水王问题续

一.题目 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 二.设计思想 延续上一篇找发帖数超过一半的ID的

课堂练习—找水王(续)

一.题目 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗 二.设计思路 上次是每次删除两个ID,即如果两个ID不同则删除,相同则保留,这次参考原来问题的解法,如果按照数序删除四个完全不同的ID,那么,最后剩下的就是原先发帖比例大于1/4的ID.循环这个过程,把ID总数降低,从而得到问题的答案. 三.源代码 #include<iostream.h> int main() { int ID[10]={1

找水王课堂练习

1题目要求: 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 2 设计思路: 1首先如果每次删除两个不同的ID,那么,在剩下的ID列表中,“水王”ID出现的次数仍然超过总数的一半. 2重复这个过程,把ID列表中的ID总数降低,最后找到水王. 3源程序代

找水王(续)

一.题目: 1 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数 目超过了帖子数目的一半. 2 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?(参考核心代码) 3 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 二.设计思想 给

找水王问题

1.题目: 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 2.设计思路: 采用消消乐的逆向思想,把相邻的两个不同id依次消掉,由于水王id多于总数的一半,所以最终剩下的一定是水王id. 3.源代码: 1 #include <iostream.h>