课堂练习-找水桶(4.24)

题目:

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

一、设计思想

课上老师一直强调与上次找水王的方法类似,虽然课上没能想出方法,但课下通过思考和观察找水王的程序,只需在原来基础上从一次消去两个,变为一次消去四个;三个水桶可以说是等价的,其数量均超过四分之一,所以一次消去四个后剩下的必然是三个水桶。需要变的只是从存一个水王到存三个水桶,变化方法与上次程序类似。因此只需对上次的程序复制粘贴,再稍稍修改一下即可。

二、源代码

 1 #include<iostream.h>
 2 int main()
 3 {
 4     int i,j,k=1,q=1,p=1,shuitong1,shuitong2,shuitong3;
 5     int a[100];
 6     cout<<"请输入id数:";
 7     cin>>j;
 8     cout<<"请输入id:";
 9     for(i=0;i<j;i++)
10     {
11         cin>>a[i];
12     }
13     shuitong1=a[0];
14     shuitong2=a[1];
15     shuitong3=a[2];
16     for(i=3;i<j;i++)
17     {
18         if(shuitong1!=a[i]&&shuitong2!=a[i]&&shuitong3!=a[i])
19         {
20             k=k-1;
21             q=q-1;
22             p=p-1;
23             if(k<=0&&q>0&&p>0)
24             {
25                 shuitong1=a[i+1];
26                 k=1;
27                 i++;
28             }
29             else if(k>0&&q<=0&&p>0)
30             {
31                 shuitong2=a[i+1];
32                 q=1;
33                 i++;
34             }
35             else if(k>0&&q>0&&p<=0)
36             {
37                 shuitong3=a[i+1];
38                 p=1;
39                 i++;
40             }
41             else if(k<=0&&q<=0&&p>0)
42             {
43                 shuitong1=a[i+1];
44                 k=1;
45                 shuitong2=a[i+2];
46                 q=1;
47                 i=i+2;
48             }
49             else if(k<=0&&q>0&&p<=0)
50             {
51                 shuitong1=a[i+1];
52                 k=1;
53                 shuitong3=a[i+2];
54                 p=1;
55                 i=i+2;
56             }
57             else if(k>0&&q<=0&&p<=0)
58             {
59                 shuitong2=a[i+1];
60                 q=1;
61                 shuitong3=a[i+2];
62                 p=1;
63                 i=i+2;
64             }
65             else if(k<=0&&q<=0&&p<=0)
66             {
67                 shuitong1=a[i+1];
68                 k=1;
69                 shuitong2=a[i+2];
70                 q=1;
71                 shuitong3=a[i+3];
72                 p=1;
73                 i=i+3;
74             }
75         }
76         else if(shuitong1==a[i]&&shuitong2!=a[i]&&shuitong3!=a[i])
77         {
78             shuitong1=a[i];
79             k=k+1;
80         }
81         else if(shuitong1!=a[i]&&shuitong2==a[i]&&shuitong3!=a[i])
82         {
83             shuitong2=a[i];
84             q=q+1;
85         }
86         else if(shuitong1!=a[i]&&shuitong2!=a[i]&&shuitong3==a[i])
87         {
88             shuitong3=a[i];
89             p=p+1;
90         }
91
92     }
93     cout<<"水桶id分别为:"<<shuitong1<<","<<shuitong2<<","<<shuitong3<<endl;
94     return 0;
95 }

三、结果截图

四、实验总结

本次实验我学到的最多的就是要学会类推,当我掌握一种方法的时候,要学会运用它去解决一系列类似的问题。首先要找到两个问题的相同点,看能否做相类似的处理,在分析后,如果能,再找到它们的不同之处,针对不同之处做出相应的修改,问题应该就能解决。

时间: 2024-10-10 23:20:25

课堂练习-找水桶(4.24)的相关文章

课堂练习_水桶

一.问题描述 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID. 据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 二.解决思想 根据上一次水王的方法,我这次试用的还是“消消乐”的方法,不过与上次不同的是,在这次的代码中,计数器变成了三个, 同时,由一个“水王”,变成了三个“水桶”,思想和上次的一样. 三.源代码 //田永涛 //2015.4.25 #include "stdafx.h" #include <stdio.h> #

课堂练习--“找水王续&quot;

设计思路: ①跟上次思路一样,将问题简化成从一个数组中找出出现次数最多的3个数. ②将“两两相消"的思路模式,变成“三一相消” ③初始化time为零,kingid为零,然后按顺序赋值,遇到跟kingid1相同的time1+1,其余两个同样:遇到跟三个都不同的所有time-1. 代码: import java.util.*; public class Findthreenum { public static void main(String[] args) { Scanner input = ne

课堂作业——找1

题目: 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12) = 5: 在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少? 设计思想: (解法一) 开始想到了一个最简单的方法来计算f(N),那就是从1开始遍历,直到N结束,把其中每一个数中含有“1”的个数加起来,结果就是从1到N所有“1”的个数的和.这个方法很简单,但算法的实现效率是个大问题,如果N很大,则

课堂练习——找十进制数中数字1的个数

题目要求: 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12)  = 5. 2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 一.解决思路 通过列举几个数进行计算,可以发现函数f(N)规律如下: 1.一位十进制数:当N>=1时,f(N)=1:当N=0时,f(N)= 0; 2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4=6

软件工程课堂练习——找出1-n中1出现的个数

题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求:写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数.例如 f(12)  = 5. 在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 一.设计思想 通过归纳法,可以发现: 假设N = abcde,这里a,b,c,d,e分别是十进制数N的各个数位上的数字.如果要计算百位上出现1的次数,将受3方面因素影响:百位上的数字,百位以下(低位)的数字,百位(更高位)以上的数字.

软件工程课堂练习找水王s

题目:发现,“超级水王”没有了.统-计结-果表-明,有3个发帖很多的ID,他们的 数目都超过了 总数目N的1/4.你能从 ID列表中快速找出他们的ID吗? 思路:关联型容器可以很方便解决,php里的array就是关联型数组,php有很多方便的排序函数,所以本次用php实现. 首先对id列表进行遍历,以id为键值对数组$result进行赋值, 如果$result[$id]没有初始化,那么这就是第一次出现,即$result[$id]=1 如果$result[$id]已经初始化,那个发帖数加1,即$r

课堂练习——找1

题目要求: 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求:  1   1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12)  = 5.  2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 一.设计思路 通过列举法,总结函数f(N)规律如下: 1.一位十进制数:当N>=1时,f(N)=1:当N=0时,f(N)= 0; 2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4=6;

课堂作业——找水军

题目: 思路: 编程之美的扩展了这个问题,在求解找出一个“水王”的基础上进行补充分析,之前遍历数组的时候只用保存两个值:一个是数组中的ID,一个是它对应出现的次数.而这次需要找出3个ID(即输出3个结果),就需要另开辟新的数组来分别保存.首先保存前3个ID,每当遍历下一个ID的时候,先要判断下一个和当前保存的这3个ID是否有相同的,若有相同的则此ID对应的次数加1:若不同则次数减1.再判断如果有ID次数为零,就用下一个ID把它替换,并把次数设为1.与之前不同的是,可能会出现次数都不为0的情况,这

课堂测验-找水王

设计思想: 因为水王是每一贴必回,那么他的总数站在所有总数的一半以上,又因为这是一个贴吧的数据库,那么他的数据很多很多,这是一个大数据. 从基于他是个大数据,那么肯定误删很多东西,那么我们姑且将一个和他的后一个,进行比较,如果相同保留,如果不同,那么值为-1,就这样,为正的必是水王,或者绝大部分是水王. 代码: 1 package Findmax; 2 3 public class a2 { 4 public static void main(String[] args) { 5 // TODO