算法练习 (二)

  上一篇做的题比较简单, 今天做了几题难度大了一些的题(可能很多人觉得还是很简单...我也得一步一步慢慢提高啊), 但是没有答案, 网上也没有找到答案. 所以不知道是对是错. 不过值得庆幸的是, 程序几乎没有Bug, 一次就运行出结果了, 只是不知道答案对错罢了. 希望各位博客园的园友们有兴趣帮小弟纠正纠正这些不好的算法:-)

  不知道为什么网上找的关于ACM的资料几乎都是用Pascal语言写的, 而我们学校要求是必须用C/C++写, 我也知道语言只是工具, 算法才是核心, 但我看到满篇的Pascal我还是没有耐心研读. 如果大家有什么好的关于<ACM试题和答案>, 并是用C/C++写的, 推荐给我哦:p

  下面暴露一下今天写的代码, 这两道题还有比较有意思的...第一题代码有什么不好的地方, 希望得到大家的批评和指点. 有兴趣做算法的, 也可以练练.

  还有, 我不知道像写C++这种控制台程序, 在代码里加上什么代码, 可以输出程序运行时间.

一、聪明的情侣

  酋长的女儿艾丽要出嫁了,按以往的风俗习惯,要搭个高台,台下是众多的求婚者,艾丽在台上扔束花,扔在台下谁身上,艾丽就得嫁给谁。但她担心落不到心爱的雷蒙身上。艾丽私下约雷蒙商量如何是好。雷蒙想出了一个主意……艾丽便和父亲说:“我不愿意搭台撒花,这么多人来,挤在一起乱哄哄的,没秩序。”父亲说,“不这样也可以,但结婚时要当场在人群中决定嫁给谁,不许指名,方法你自己定。”艾丽高兴的告诉主持人如何行事。婚日来临,人群拥挤,主持人叫求婚者排成一队,雷蒙在队外数了数队列共有101人,于是自己找了个合适的位置也站在队列中,主持人要大家从前往后1212……报数,报单数的退出场外,余下的人位置不变,再重新从前往后1212……报数,报单数的退场,如此下去最后只剩一人,艾丽便嫁给谁。大家惊奇的发现最后剩下的竟是雷蒙。请用程序回答雷蒙刚开始站在队列中的第几个位置。

  我的思路: 据题意, 算上雷蒙, 那应该是一共有102个男的来参加这个酋长女儿的"非诚勿扰"专场的, 我用了一个102个元素的Array数组,每个元素初始值都为1,表示都还没有被淘汰,以后淘汰了的用0表示, 用一个bool值来标记当前数组元素等于"1"的位置是单数还是双数(单数即为true). 循环数组里每一个的元素,当Array[i]==1的时候,进入一个判断,如果判断这个元素处在单数的位置,则把它的值改为0,这一个循环结束后,统计这102个元素的和,如果和为1的话,说明数组里只剩下一个人了, 然后输出这个人的位置(就是数组下标+1).循环多少次呢? 我用了一个do...while循环,当102个元素的和不为1的时候,循环. 

#include<iostream>
using namespace std;
int main()
{
    
int n;                            //这个数用来表示所有数组元素加起来的和
    bool t = false;                    //用t标记此时的Array[i]是否为奇数位置的数
    int Array[102];
    
for(int i = 0; i <= 101; i ++)
    {
        Array[i] 
= 1;                //把数组102个元素都置为1,表示一开始都有资格参赛
    }
    
do
    {
        n 
= 0;                        //将n清0
        for(int i = 0;i <= 101; i ++)
        {
            
if (Array[i] == 1)
            {
                t 
= !t;
                
if(t == true)        //是奇数位置的话,就把Array[i]置为0,表示淘汰
                Array[i] = 0;
            }
            n 
+= Array[i];
        }
        
if(n == 1)                    //n等于1了,说明数组中之剩下一个人还没有淘汰
        {
            
for(int i = 0; i <= 101; i ++)
            {
                
if (Array[i] == 1)
                cout 
<< i+1 << endl;    //输出这个人排的位置(因为数组从0开始下标的,所以要+1)
            }
        }
    }
while (n != 1);                //当数组中没有只剩下一个人的时候,执行循环
    return 0;
}

输出:

76

但我觉得这个结果是错的...不知道是不是这样...

二、最佳编码

  某通讯单位打算传递一段信息“XYZWYZWZYWYXZY,为提高安全性,打算将字母W,X,Y,Z分别用不同的0,1编码进行表示,并希望编码后,该段信息的编码总长度越短越好。请编写程序设计编码方案。

  我的思路: 我想用哈夫曼编码啊, 可是不知道怎么编写成代码.我想在代码中实现这样的功能: 输入字符串"XYZWYZWZYWYXZY", 回车, 然后程序输出用0,1表示的编码. 今天在网上看了很多,图书馆也找了不少数据结构的书,书上讲到哈夫曼编码也都只是介绍,没有详细的过程, 看了很久还是只编了一半...

  分析: X出现2次, W出现3次, Z出现4次, Y出现5次. 画出哈夫曼图...左子树用0表示, 右子树用1表示的话, 那么编码是X可以用000表示,W用001表示,Z可以用01表示,Y可以用1表示. 编码出来共是28位.(跟用00表示X,01表示Y,10表示Z,11表示Y,编码也是28位. 这仅是巧合).这题不晓得怎么下手,寻帮助.

  

继续练习算法...

原文地址:https://www.cnblogs.com/technology/p/1736275.html