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;
}

网上找到了一个非常好的解法:

http://blog.csdn.net/hackbuteer1/article/details/7450250

虽然与卡特兰数的关系没有看懂,但是解法看懂了。很有启发性 重点看。 尤其是其中二进制的应用。

另附一个讲解二进制很好的博客:http://www.cnblogs.com/xianghang123/archive/2011/08/24/2152408.html

//网上答案 http://blog.csdn.net/hackbuteer1/article/details/7450250
#include <iostream>
using namespace std;int bit_cnt(int n)
{int result = 0;for (; n; n &= n-1, ++result);  //统计n中 1的个数  每次把最低位的1清零return result;
}int main(void)
{int F[6], B[6];int i,j,k,state,ok,ans = 0;for (state = 0; state < (1 << 12); ++state){if (bit_cnt(state) == 6){i = j = 0;for (int k = 0; k < 12; ++k){if(state&(1<<k))  //判断对应位是否为1F[i++] = k;elseB[j++] = k;}ok = 1;for (k = 0; k < 6; ++k){if (B[k] < F[k])   //B和F分别是从小到大排的 只要检查对应位置的相对大小是否符合要求即可
                {ok = 0;break;}}ans += ok;}}cout << ans << endl;return 0;
}

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

  1. java编程题身高排队_身高排队算法-(较优解):12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?...

    本人对解决算法有兴趣,曾在网上看到过一道阿里巴巴的面试题. 题目是这样的:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 所以自己也考虑了一 ...

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

    此题参考与其他人思路, 2个解题方式. 1. 1 /** 2 * 用java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 3 * ...

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

    12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第一排比对应的第二排的人高,问排列方式有多少种? 思想:分析一下排列法,发现:每次安插第二排时,只要等第一排的选完了,再选最小值就行了.而选第 ...

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

    分析问题: 显然可知,选人的顺序不影响最终结果数,所以我们对12个人从矮到高排序,编号1-12,依次放入队伍里. 1号肯定放在第0排第0列.假如1号放在任何其他位置,都需要有比他高的人放在0排0列,必 ...

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

    /** *  */ public static void main(String[] args) { // TODO Auto-generated method stub InLineProblem( ...

  6. 12个高矮不同的人排成两排

    作者:baihacker  来源:http://hi.baidu.com/feixue http://hi.csdn.net/baihacker 问题描述:  12个高矮不同的人,排成两排,每排必须是 ...

  7. pta基础编程题目集 7-1 厘米换算英尺英寸

    #基础编程题目集 7-1 厘米换算英尺英寸 如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048.现在,如果用户输入的是厘米数,那么对应英制长度的 ...

  8. 编程题目+数据库题目总结(3)

    目录 编程题 1.字典中保存了一些股票代码(键)及价格(值),用一行代码找出价格最高的股票,输出股票代码.(5分) 2.字典中保存了一些股票代码(键)及价格(值),用一行代码对字典按股票价格从高到低进 ...

  9. HHTC_学校集训编程题目(13)(组队赛_3)

    HHTC_学校集训编程题目(13)(组队赛_3) C - Wandering Robot G - Circle B - 迷宫寻宝 D - 给力的移动 E - 谁还不是个宝宝 K - Teamwork ...

最新文章

  1. BundleTrack:无需实例或类级别3D模型的6D姿态跟踪算法(IROS2021)
  2. 区块链应用 | 区块链将永久改变法律行业的七种方式
  3. python知识思维导图
  4. 10 步让你成为更优秀的程序员
  5. 互联网测试开发面试题集锦(下)完结篇
  6. Cocos2d-X-3.0之后的版本的环境搭建
  7. linux docker状态,Linux之Docker
  8. 【C++】【Opencv】【vs2015】环境配置
  9. 《Splunk智能运维实战》——2.8 列出浏览次数最多的产品
  10. Quick BI 支持多种数据源进行多维分析 1
  11. pass 软件_杀毒软件哪家强?今天来聊聊关于保护你电脑的杀毒软件那些事!
  12. 基于Android语言的通信调试助手实现(TCP协议+Socket编程)
  13. windows无法安装软件
  14. 如何在不支持双面打印的打印机上实现双面打印
  15. Java基于CountDownLatch的并发测试工具
  16. 「 Mac应用加密工具」AppLocker for Mac 2.7.0
  17. OpenStack实战
  18. linux系统benchmark工具,Linux下一种简单易行的cpu benchmark方法
  19. http协议的状态码(statue) / readyState状态码
  20. 后端返回PDF文件流,前端处理展示及打印

热门文章

  1. oracle 添加外键,报“未找到父项关键字”
  2. 玩转ptrace (一)
  3. easyui datagrid 让某行复选框置灰不能选
  4. 含羞默默一张一合效果---田
  5. C# string类型转换为float精度问题
  6. windows NFS 配置
  7. C#中datagirdview表头变换
  8. jave 逻辑运算 vs 位运算 + Python 逻辑运算 vs 位运算
  9. Nginx配置同一个域名同时支持http与https两种方式访问
  10. HTML入门学习 -- HTML5 视频与音频