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

题目:



代码:

#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))))))

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值