码迷,mamicode.com
首页 > 其他好文 > 详细

ctrip的两道笔试题

时间:2014-09-18 22:02:24      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:blog   os   使用   ar   for   div   art   问题   log   

第一个问题可以抽象为这样:给定一个数组A,和一个数t,用数组里的一些数求和得到t,数组里的数可以重复使用,写一个算法,使得使用A中最少的数来表示t。

比如:[2,4,6,9],18==>[9,9]

dfs问题

//numbers要从大到小,一个sort搞定,result存放结果
bool dfs(vector<int>& numbers,int gap,int start,vector<int> &result)
{
	if(0 == gap)
	{
		return true;
	}
	bool r = false;
	for(int i = start; i < numbers.size(); ++i)
	{
		if(gap < numbers[i])
			continue;
		result.push_back(numbers[i]);
		r = dfs(numbers,gap-numbers[i],i,result);
		if(!r)
		{
			result.pop_back();
		}else
		{
			return r;
		}
	}
	return r;
}

还有一个题是说给定若干有序区间,求第k个数,感觉可以用二分法做,但是没想出来,所以就进行遍历,时间复杂度为O(n)

void kth(vector<vector<int> > &numbers, vector<int> &pos,int k, int &result)
{
	if(0 == k)
		return ;
	int index = 0;
	int min = INT_MAX;
	int indexx = -1;
	for(;index < numbers.size(); ++index)
	{
		if(pos[index] != -1 && numbers[index][pos[index]] < min)
		{
			min = numbers[index][pos[index]];
			indexx = index;
		}
	}
	result = min;
	++pos[indexx];
	if(pos[indexx] == numbers[indexx].size())
	{
		pos[indexx] = -1;
	}

	kth(numbers,pos,k-1,result);
}
int getkth(vector<vector<int> > &numbers, int k)
{
	vector<int> pos(numbers.size(),0);
	int result = -1;
	kth(numbers,pos,k,result);
	cout<<result<<endl;
	return result;
}

  

ctrip的两道笔试题

标签:blog   os   使用   ar   for   div   art   问题   log   

原文地址:http://www.cnblogs.com/dy-techblog/p/3980125.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!