“找水王”编程实现。

题目:

在一个贴吧里,有一个水王,经常发帖,回帖,整个贴吧,有一半以上是他的帖子,已知有一张帖子清单,含有作者ID,试编写程序,找出水王。

方法:

1.首先以第一个id开始,与下一个id比较,若相同,则与再下一个比较直至两个id不同,然后清空

2.在从现有的id中选择第一个id重复以上步骤

3.重复以上步骤,直至剩余仅有一个id,即为水王

源代码:

#include <iostream>
#include <fstream>
#include <string>
using namespace  std;

char ID[1000][20];//保存从文件读到的id
int i=0;//记录id总个数

void input()//从文件读取数据
{
    string mid_path;//文件路径
    i=0;//初始化i

    cout<<"请输入文件路径:"<<endl;
    cin>>mid_path;

    char path[20];//将文件路径转换为字符数组形式,保存到该数组。

    ifstream infile;//定义文件读入类型

    //判断路径是否正确,不正确则重新输入
    do
    {
        strcpy(path,mid_path.c_str());//将字符串转换为字符数组

        infile.open(path);//打开指定文件

        //infile.open("G:\\1.txt");
        if (!infile)//判断是否已打开
        {
            cout<<"打开文件错误,请重新输入文件路径:"<<endl;
            cin>>mid_path;
        }
    } while (!infile);

    while (!infile.eof())//读取文件,知道结束
    {
        infile>>ID[i];
        i++;
    }
    infile.close();//关闭文件
}
void find()//找水王函数
{
    cout<<"<<"<<endl;
    i--;//排除最后一个空字符串
    int id_first=0;//作为比较的第一个比较元素的下标
    int id_second=0;//作为比较的第二个比较元素的下标
    bool flag=0;//判断是否比较到最后一个ID,若比较到最后一个ID,说明比较结束,剩余的最后一个ID即为水王

    for (;;)
    {
        id_second=id_first+1;//每一个元素不会与本身比较

        if (strcmp(ID[id_first],"0")==0)//若元素已被清空,则寻找下一个元素
        {
            id_first++;
        }
        else
        {
            for (;;)
            {
                if (id_second==i)//第二个比较元素为最后一个时,说明已寻到水王
                {
                    flag=1;
                    break;
                }
                if (strcmp(ID[id_first],ID[id_second])==0||strcmp(ID[id_second],"0")==0)//若两个元素一样,或者第二个元素已清空,则第二个元素往下继续寻找
                {
                    id_second++;
                }
                else
                {
                    //清空不同的元素
                    strcpy(ID[id_first],"0");
                    strcpy(ID[id_second],"0");
                    id_first++;
                    break;
                }

            }

        }
        if (flag==1)//若已结束,则结束循环。
        {
            break;
        }

    }
    cout<<"水王ID为:"<<endl;
    cout<<ID[id_first]<<endl;
}
int main()
{
    input();
    find();
    return 0;
}

测试用例:

运行结果:

时间: 2024-08-07 04:31:31

“找水王”编程实现。的相关文章

找水王(二)

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

找水王 多个水王

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.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗 二.设计思路 参考原来问题的解法,如果每次删除4个不同的ID(不管是否超过总数1/4的ID),那么,剩下的ID列表中,原先发帖比例大于1/4的ID所占比例仍然大于1/4.可以通过不断重复这个过程,把ID总数降低,从而得到问题的答案.具体方法:用candidate[3]记录三个候选ID,用count[3]记录它们的累积次数,然后遍历整个ID列表,

找水王问题

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

课堂练习—找水王(续)

一.题目 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的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,你能从发帖列表中快速找到他们吗? 二.设计思想 给

找水王-课堂作业

程序代码 结果截图 实验总结 因为水王是整个论坛中发帖和回帖数加起来最多的的人,且超过总帖数的一半以上.(这里将发帖数和回帖数记在一起)使用"两两相消"的方法.将帖子的作者id纳入数组,将数组中的一个数记作疑似水王者,并记发帖数t=0.遍历数组,若数组中的数和疑似水王者id相同,使发帖数t加一.如与疑似水王者id不同,使发帖数t减一.当t=0时,将数组中当前与水王疑似者比较的数作为新的疑似水王者.循环结束,当前水王怀疑者就是水王.

软件工程概论---找水王问题

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