eBay校园招聘编程题-淘气的小明

来源:互联网 发布:闽江网络教学平台 编辑:程序博客网 时间:2024/05/17 04:41

题目:



代码:

#include <stdlib.h>#include <stdio.h>#include <algorithm>#include<iostream>#include<hash_set>#include<hash_map>#include <string>using namespace std;vector<int>base = { 0, 1, 1, 2, 2, 2, 3 };int countnumber(int num) {if (num <= base.size() - 1)return base[num];vector<int>tmp = base;for (int i = 7; i <= num; i++)tmp.push_back(tmp[i / 2] + 1);return tmp[num];}int main(){int len, number;cin >> number;while (number){//段数cin >> len;int re = countnumber(len);cout << re << endl;number--;}return 0;}

输出:


解析:

刚开始看到这个题,觉得十分困难,最大的问题是如何实现任意三根竹子之间不能构成三角形,如果解决了这个问题那么其它的问题都好解决!!

我们知道如果给定三个整数a,b,c,如果这三个数不能构成三角形那么只要满足a>=b+c,其中a是最大的数,那么它们就不能构成三角形,那么对于这个问题,我们要进行

类似的应用,假设我们有一个数num=17,一开始我们也不知道它会被切成多少段,但是为了满足任意三段都不能构成三角形,我们做如下操作

第一步:

先将17分成两段,如果num是偶数,那么两段的长度相等,如果是基数,那么会被分成9和8两段;

第二步:

我们对第一步中的较小者再次进行切割,因为17被分成了9和8两段,如果继续对8进行切割,那么无论8被切割成多少段,我们在8的段数中任意两段的和都不会大于9;

第三步:

进过上述两步操作,17被切割成9,4,4,对最后一个4我们进行递归,就像处理17一样。这个时候4只能被切割成3和1,所以17最终被切割成17=9+4+3+1;


所以这个算法的逻辑是将num切割成如下形式:

a1(a2(a3(a4(a5(a6(a7))))))

当我们随便取三个数的时候,其中一个数和另外两个数必然不再一个括号里,那么那两个数的和必然小于或等于另外一个数,所以它们一定不能构成三角形!!!!


0 0
原创粉丝点击