课堂练习_水桶

一、问题描述

    随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。

  据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?

二、解决思想

    根据上一次水王的方法,我这次试用的还是“消消乐”的方法,不过与上次不同的是,在这次的代码中,计数器变成了三个,

  同时,由一个“水王”,变成了三个“水桶”,思想和上次的一样。

三、源代码

  

//田永涛
//2015.4.25
#include "stdafx.h"
#include <stdio.h>
#define Length 21                //设置最大长度为100
int MIN(int num[])                //求出count[]中最小的数,以便减1
{
    int min;
    min = num[1];
    for(int i=1;i<3;i++)
    {
        if(min>num[i])
            min = num[i];
    }
    return min;
}
void judge(int Arr[Length])
{
    int i,j = 0;
    int flag1,flag2,flag3;                        //用来表示水桶
    int count[3] = {0,0,0};                        //用来计录当前水王数目
    flag1 = -1;                                    //初始化水桶
    flag2 = -1;
    flag3 = -1;
    while((flag1==-1)||(flag2==-1)||(flag3==-1))    //while循环做的是将ID表中不相等的最前的三个找出并作为水桶
    {
        if((flag1 == Arr[j])||(flag1 == -1))
        {
            flag1 = Arr[j];
            count[0]++;
        }
        else if((flag2 == Arr[j])||(flag2 == -1)) //将水桶与ID表中的数赋值
        {
            flag2 = Arr[j];
            count[1]++;
        }
        else if((flag3 == Arr[j])||(flag3 == -1))
        {
            flag3 = Arr[j];
            count[2]++;
        }
        j++;                                    //用来计数,记录当前ID表中已经遍历的ID数目
    }
    for(i=j;i<Length;i++)                        //运用“消消乐”的方法,将ID表中的水桶找出
    {
        if(flag1 == Arr[i])                        //当当前ID与已知的水桶相等时
        {
            flag1 = Arr[i];
            count[0]++;
        }
        else if(flag2 == Arr[i])
        {
            flag2 = Arr[i];
            count[1]++;
        }
        else if(flag3 == Arr[i])
        {
            flag3 = Arr[i];
            count[2]++;
        }
        else                            //d当当前的ID与已知水桶的三个ID都不相等时
        {
            if(count[0] == MIN(count))        //找出最小的count,减1
            {
                count[0]--;
                if(count[0]<1)
                {
                    flag1 = Arr[i+1];
                    count[0] = 1;
                    i++;
                }
            }
            else if(count[1] == MIN(count))
            {
                count[1]--;
                if(count[1]<1)
                {
                    flag2 = Arr[i+1];
                    count[1] = 1;
                    i++;
                }
            }
            else if(count[2] == MIN(count))
            {
                count[2]--;
                if(count[2]<1)
                {
                    flag3 = Arr[i+1];
                    count[2] = 1;
                    i++;
                }
            }
        }
    }
    printf("水桶的ID是:%d %d %d\n",flag1,flag2,flag3);                //输出结果
}
int main(int argc, char* argv[])
{
    int Array[Length] = {1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4};
    printf("ID表中的内容是:\n");
    for(int i=0;i<Length;i++)
    {
        printf("%d ",Array[i]);
    }
    printf("\n\n");
    judge(Array);
    return 0;
}

四、运行截图

  

五、总结

    这次的课堂作业和上次的几乎一样,最起码在代码实现的思想上是一样的,但是,我觉得在一些小细节方面还是有所不同的。

  比如:在对水桶flag1,flag2,flag3赋值时,如果采用flag1 = Arr[0],flag2 = Arr[1],...时,显然是不合适的,因为前几个ID

  有可能一样,因此,在代码实现的过程中,我运用了while语句(具体实现方法请看代码),对ID表中最前面不一样的三个赋值,且

  对计数器count[i]进行++,

  这样就能解决问题了。

时间: 2024-10-13 15:42:20

课堂练习_水桶的相关文章

C#开发课堂实录_页数447_出版日期2016.02_完整版PDF电子书下载 带索引书签目录高清版

C#开发课堂实录_页数447_出版日期2016.02_完整版PDF电子书下载 带索引书签目录高清版_13937404 下载链接  http://pan.baidu.com/s/1bo4lFzh [作 者]张冬旭,马春兴编 [丛书名]课堂实录 [形态项] 447 [出版项] 北京:清华大学出版社 , 2016.02 [ISBN号]7-302-40539-5 [中图法分类号]TP312 [原书定价]69.00 [主题词]C语言-程序设计 [参考文献格式] 张冬旭,马春兴编. C#开发课堂实录. 北京

课堂练习-找水桶(4.24)

题目: 三人行设计了一个灌水论坛.随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 一.设计思想 课上老师一直强调与上次找水王的方法类似,虽然课上没能想出方法,但课下通过思考和观察找水王的程序,只需在原来基础上从一次消去两个,变为一次消去四个:三个水桶可以说是等价的,其数量均超过四分之一,所以一次消去四个后剩下的必然是三个水桶.需要变的只是从存一个水王到存三个水桶,变化方法与上次程序类似.因此只需对上

课堂练习_找出1的个数

一.思路想法 在找出1的个数,首先不能用穷举的方法.在此程序中,我借鉴了同学的方法,将各个位 上的数值的1的个数相加,最后得出最终的个数. 二.代码 #include "stdafx.h" #include <stdio.h> int Count(int num) { int count,mul,num1,num2,num3; count=0; mul=1; num1=num2=num3=0; while(num/mul) { num1=num-(num/mul)*mul;

简单的苗为课堂搜索版式编写《超链接》

1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="UTF-8"/> 5 <title>无标题文档</title> 6 <style> 7 #box{width:534px;font-family:"宋体";} 8 #title{height:31px;line-height:27px;font-size:15px;} 9 #ti

网易云课堂_C++程序设计入门(上)_第2单元:丹青画松石– EGE图形库_第2节:一个简单的EGE程序

网易云课堂_C++程序设计入门(上)_第2单元:丹青画松石– EGE图形库_第2节:一个简单的EGE程序 #ifndef _GRAPHICS_H_ #define _GRAPHICS_H_ #ifndef __cplusplus #error You must use C++ compiler, or you need filename with '.cpp' suffix #endif #include "ege.h" using namespace ege; #endif #inc

小D课堂 - 零基础入门SpringBoot2.X到实战_汇总

小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_1.SpringBoot2.x课程介绍和高手系列知识点 小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_2.SpringBoot2.x依赖环境和版本新特性说明 小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_3.快速创建SpringBoot应用之手工创建web应用 小D课堂 -

网易云课堂_C语言程序设计进阶_第一周:数据类型:整数类型、浮点类型、枚举类型

C语言程序设计进阶_第一周:数据类型:整数类型.浮点类型.枚举类型 1.0数据类型 1.1整数类型 1.2浮点类型 1.3逻辑类型 1.4类型转换和条件运算 1.0数据类型 1 整数 char(%c), short, int(%d), long(%ld), long long(C99) 2 浮点数 float(%f), double(%lf), long double(C99) 3 逻辑 bool(C99) 4 指针 5 自定义类型 所表达的数的范围:char<short<int<flo

小D课堂 - 新版本微服务springcloud+Docker教程_汇总

小D课堂 - 新版本微服务springcloud+Docker教程_1_01课程简介 小D课堂 - 新版本微服务springcloud+Docker教程_1_02技术选型 小D课堂 - 新版本微服务springcloud+Docker教程_2_01传统架构演进到分布式架构 原文地址:https://www.cnblogs.com/wangjunwei/p/11434371.html

基于 request cache 请求缓存技术优化批量商品数据查询接口_一点课堂(多岸学院)

基于 request cache 请求缓存技术优化批量商品数据查询接口 Hystrix command 执行时 8 大步骤第三步,就是检查 Request cache 是否有缓存. 首先,有一个概念,叫做 Request Context 请求上下文,一般来说,在一个 web 应用中,如果我们用到了 Hystrix,我们会在一个 filter 里面,对每一个请求都施加一个请求上下文.就是说,每一次请求,就是一次请求上下文.然后在这次请求上下文中,我们会去执行 N 多代码,调用 N 多依赖服务,有的