【编程题目】12 个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,

80.阿里巴巴一道笔试题(运算、算法)
问题描述:
12 个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,
问排列方式有多少种?

我的思路:输入从小到大排列的数字  把数字4个分为一组 如下:

min **** B

A    **** max

其中第一个数字一定是当前最小的, 最后一个数字一定是当前最大的。 其次,设位置A 、B,这样去掉这四个数字, 问题又变成了规模小一些的同样的问题。

关键是A和B的确定,有很多种可能,我们依次尝试,如果不满足问题的条件了,就退出来,换一个数字。

A的大小: 最小可能是当前输入的第【2】个数字, 最大可能是当前输入的第 【len(输入数字的个数)/2 + 1】 个数字,此外,如果它左边有数字,A必须比其左边的数字大。

B的大小:最小的可能是第【len/2】个数字,最大的可能是第【len - 1】个数字,此外,如果它右边有数字,B必须比其右边的数字小。

收获:被if else语句搞晕了, 如果用if else 则是选择关系, 几个条件只会检查其中一个。这里检查条件是要求全部都检查,所以不能加else。

/*
80.阿里巴巴一道笔试题(运算、算法)
问题描述:
12 个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,
问排列方式有多少种?
start time = 19:20
end time = 第二天 10:56
*/

#include <stdio.h>
#include <stdlib.h>

#define N 12
int way[2][6]; //存储方式

/*
min ***** B
A   ***** Max
*/
int TwoLines(int * num, int len) //输入数字必须从小到大排列
{
    static int ways = 0;
    if(len == 0)
    {
        ways++;
        printf("way:%d\n", ways);
        for(int j = 0; j < 2; j++)
        {
            for(int i = 0; i < N/2; i++)
            {
                printf("%d ", way[j][i]);
            }
            printf("\n");
        }
    }
    int minloc = (N - len)/4;  //当前最小数字的位置
    int maxloc = (N + len)/4 - 1; //当前最大数字的位置
    way[0][minloc] = num[0];
    way[1][maxloc] = num[len - 1];

    int Bminloc = len / 2 - 1;  //B最小可能的取值在num数组中的位置
    int Bmaxloc = len - 2;
    int Aminloc = 1;
    int Amaxloc = len/2;

    for(int b = Bminloc; b <= Bmaxloc; b++)
    {
        for(int a = Aminloc; a <= Amaxloc; a++)
        {
            if(a == b ) //数字不能相同
            {
                continue;
            }
            if(maxloc < N/2 - 1)  //b位置的数字必须比它右边的数字小
            {
                if( !(num[b] < way[0][maxloc + 1]) )
                {
                    continue;
                }
            }
            if(minloc > 0) //a位置的数字必须比它左边的大
            {
                if( !( num[a] > way[1][minloc - 1]))
                {
                    continue;
                }
            }

            way[0][maxloc] = num[b];
            way[1][minloc] = num[a];
            int * num2 = (int *)malloc((len - 4) * sizeof(int));
            int i, j;
            for(i = 1, j = 0; j < len - 4; i++)
            {
                if(i == b || i == a)
                {
                    continue;
                }
                num2[j] = num[i];
                j++;
            }

            TwoLines(num2, len - 4);

            free(num2);

        }
    }
    return ways;
}

int main()
{
    int num[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    int ways = TwoLines(num, N);
    return 0;
}

【编程题目】12 个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,

时间: 2024-11-06 23:39:22

【编程题目】12 个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,的相关文章

java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

此题参考与其他人思路, 2个解题方式. 1. 1 /** 2 * 用java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 3 * 状态树方式解 4 * 用状态生成树的方式来做的,先把12个人按从低到高一次编号, 5 * 从(1 ; 2)出发,加入3和4的时候生成(1,3 ; 2,4)和(1,2 ; 3,4), 6 * 然后加入5和6,分别从前面的两个状态出发,可以生成5种状态,就是说6个人时有5种排列 7 * @author

C++12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

#include <iostream> #define DefaultSize 9 //问题描述: //12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? using namespace std; class Grial { public: Grial(int sz=DefaultSize) { visted = new bool [sz]; data = new int [sz]; size = sz; for(int i=1;i<

【目录】编程题目

编程题目 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1) 一个数组是由一个递减数列左移若干位形成的,在这种数组中查找某一个数.☆ 请修改 append 函数,利用这个函数实现两个非降序链表的并集 一串首尾相连的珠子(m 个),有 N 种颜色(N<=10),取出其中一段,要求包含所有 N 中颜色,并使长度最短. 求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边, 有向图不再连通 有 n 个长为 m+1 的字符串,如果某个字符串的最后 m 个字符与某个字符串的前

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

【编程题目】四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())

46.搜狐(运算):四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(()) 跟12个人排高矮的题目差不多. 用 0 表示 “(”,用 1 表示“)” 则需要数字二进制最低8位有 4个1和 4个0,且从低位到高位对1 和 0 计数时,0 出现的次数不能超过 1 出现的次数. /* 46.搜狐(运算): 四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(()) */ #include <stdio.h> int c_bits(int n) { int re

【编程题目】有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;(需要回头仔细研究)

32.(数组.规划)有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序:要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小.例如: var a=[100,99,98,1,2,3];var b=[1,2,3,4,5,40]; 首先,目标一定是先找到n个数字,使得数字和比总和的一半小,但是最接近. 思路一:开始看这道题跟之前学的动态规划很像,就想用动态规划来解.但是....做不出来........... 必须要选一半的数字让我头都大了. 思路二:

【编程题目】扑克牌的顺子

67.俩个闲玩娱乐(运算).1.扑克牌的顺子从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的.2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意数字. 思路: 用min.max记录输入的牌对应的数字大小,不考虑王,用wnum记录王的个数, record[13]记录每种牌是否出现过.设要判断n个牌是否连续 只要  出现不重复 且(max - min + 1) 在 [ n - wnum , n ]之间即可 /* 67.俩个闲玩娱

火车调度-c#求解-英雄会在线编程题目

题目: 火车调度 返回首页 发布公司: 有 效 期: 赛 区: CSDN 2014-04-30至2015-04-30 北京 难 度 等 级: 答 题 时 长: 编程语言要求: 120分钟 C C++ Java C# 题目详情 火车从A地和B地之间运行,你知道火车从某地出发的时间和到达某地的时间(这个时间出发,一定这个时候到达).火车到达目的地后,不能立刻返回,需要经过t分钟检修才可以返回.列车只在A.B两地运行.你知道每天内的时刻表,求A,B两地各需要存放多少辆列车,才能满足这个时刻表?即只要该

【编程题目】输入一颗二元查找树,将该树转换为它的镜像

第 15 题(树):题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点.用递归和循环两种方法完成树的镜像转换. 例如输入:8/ \6 10/ \ / \5 7 9 11输出:8/ \10 6/ \ / \11 9 7 5定义二元查找树的结点为:struct BSTreeNode // a node in the binary search tree (BST){int m_nValue; // value of nodeBSTreeNode