18年拼多多学霸批基础平台笔试题

1、Alice、Bob、Cathy、Dave四个人排队喝可乐,喝完一个人变两个,接着继续到队尾排队,问第N个人喝可乐的人是谁

如:N=8: ABCDAABB,第八个人是B

分析:

    这个问题相当每次翻倍,要看第N个人喝饮料的是谁,就要知道这是第几(i)轮喝饮料,然后减去前几轮所有喝的饮料4*(2^i-1)

在用余下的人对2^i也即是这一轮每个人重复的个数,即可得到结果。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
	long long m;
	cin >> m;
	int cnt = 0;
	long long num = 0;
	int i = -1, ci = pow(2, i);
	while ((long long)4 * ((long long)(pow(2, i+1)-1)) < m) i++;   //找是第几(i)次克隆
	if (i >= 0)
	{
		m = m - (long long)(4)*(long long)(pow(2, i) - 1);    //减去前i-1次所有的人
		cnt = (m - 1) / pow(2, i);                           //第i次每个人重复有2^i,取整得人的标记
	}
	else
	{
		cnt = m - 1;
	}
	switch (cnt)
	{
	case 0: {
		cout << "Alice" << endl;
		break;
	}
	case 1: {
		cout << "Bob" << endl;
		break;
	}
	case 2: {
		cout << "Cathy" << endl;
		break;
	}
	case 3: {
		cout << "Dave" << endl;
		break;
	}
	default:
		break;
	}
	return 0;
}

2、N个球星,M个人评级,共a-z 26个级别,a最高,z最低,球星X比球星Y评级高,则认为球星X强于球星Y,,所有一个球星强于其他所哟球星,则认为其为球王。问谁能得到球王称号

例1:N=4,M=3,评价为acbd,bacd,bdca,输出为0;

例2:N=3,M=3,评价为abc,bca,cab,输出为-1.

分析:

这个题把所有的求和级别转成数字加起来直接比较能有70%,后来在牛客网上看到一个讨论觉得很有道理,不应该用总和来求,应该用字母的优先级来求即如下例子:

输入为N=2,M=3,评价为:aa,ba,bc,输出应该为1,因为这里是abb,aac,虽然总数一样,但是应该是1强于0的

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
	int N, M;
	cin >> N >> M;
	vector<string> vs;
	string s;
	getline(cin, s);
	for (int i = 0; i < M; i++)
	{
		string st;
		getline(cin, st);
		vs.push_back(st);
		st.clear();
	}
	vector<string> vsT(N,string());
	for (int i = 0; i < N; i++)
	{
		for (int j=0;j<M;j++)
		{
			vsT[i] += vs[j][i];
		}
	}
	vector<string> svsT(vsT.begin(), vsT.end());
	sort(vsT.begin(), vsT.end());
	if (svsT[0] == svsT[1])
	{
		cout << -1 << endl;
	}
	else
	{
		for (int i = 0; i < N; i++)
		{
			if (vsT[i] == svsT[0])
			{
				cout << i << endl;
			}
		}
	}
	system("pause");
	return 0;
}

3N个货物分别重W1,W2,...Wn,(100<=W<=300),一辆车可以运300的货,问需要多少辆车

分析:

这个题在笔试时用的是直接排序后贪心,只能50%,后来想借鉴0-1背包问题,使得每个箱子装的东西尽可能多,也就是贪心那个方式改了一下,但感觉这种方式对这个题应该跟贪心差不多,因为我们物品放得最多也就100,100,100三件,其他情况最多都是两件,用0-1背包问题来解其实跟贪心差不多,复杂度还高了,而就这个题是在想不出一个贪心解决不了的例子。不知道有没有更好的例子或者更好的算法

//背包问题来解
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
	string s;
	getline(cin, s);
	vector<int> vi;
	int i = 0;
	while (i < s.size() && s[i] != '\0')
	{
		string s1;
		while (i < s.size() && s[i] != ' ')
		{

			s1 += s[i];
			i++;
		}
		i++;
		int k = atoi(s1.c_str());
		vi.push_back(k);
	}
	int re = 0;
	sort(vi.begin(), vi.end());
	for (int i = vi.size() - 1; i >= 0; i--)
	{
		if (vi[i] > 200)
		{
			re++;
			vi.erase(vi.begin() + i);
		}
	}
	int cnt = 0, num = 300;
	vector < int>  maxvalue(101,0);
	vector<bool> vb(vi.size(),0);
	while (cnt<vi.size())
	{
		cnt = 0;
		for (int i = vi.size()-1; i >=0; i--)
		{
			if (cnt < vi.size())
			{
				if (vb[i] == 0)
				{
					if (maxvalue[100] < maxvalue[100 - vi[i] + 100] + vi[i]&& maxvalue[100 - vi[i] + 100] + vi[i]<=300)
					{
						vb[i] = 1;
					}
					for (int j=100; j >=vi[i]-100; j--)
					{
						if (maxvalue[j] < maxvalue[j - vi[i]+100] + vi[i])
						{
							maxvalue[j] = maxvalue[j - vi[i]+100] + vi[i];	
						}
					}
					
				}
			}
			if (vb[i] == 1) cnt++;
		}
		if (maxvalue[100] > 0)
			re++;
		maxvalue.assign(101, 0);
	}

	cout << re << endl;
	system("pause");
	return 0;
}

 4. 这个题跟算法岗有一个题一样,见网址https://blog.csdn.net/song2016/article/details/81188457

猜你喜欢

转载自blog.csdn.net/song2016/article/details/81187109
今日推荐