拼多多2019秋招内推笔试-业务平台开发

1、复制可乐
题目描述:

自动售货机里有N瓶复制可乐。复制可乐非常神奇,喝了它的人都会复制出一个自己来!现在有Alice,Bob,Cathy,Dave四个人在排第买复制可乐。买完的人会马上喝掉,然后他和他的副本会重新去队伍的最后面排队买可乐。
问最后一个买到复制可乐的人叫什么名字?
输入描述:
输入仅有一行,包含一个正整数N(1<=N<=1,000,000,000),表示可乐的数量
输出描述:

输出最后一关复制可乐的人的名字
eg:
输入:8
输出:Bob

代码:

#include<iostream>
#include<string>
using namespace std;

int main()
{
	string strs[] = { "Alice", "Bob", "Cathy", "Dave" };
	int n = 0;
	cin >>n;

	int i = 1;
	while (n > i * 4)
	{
		n -= i * 4;
		i <<= 1;
	}
	int a = n / i;
	if (n%i)
	{
		a++;
	}
	cout << strs[a - 1];
	return 0;
}

 2、票选球王
题目描述:四年一度的世界杯又来了!小多在公司内发起了一个票选最强球星的活动,共有N个候选球星,美味投票者需要在选票上为美味候选球星评定一个实例等级,等级由英文字母表示,‘a’级是最高,'z'级最低 ,共26级。
我们称候选球星X强于候选球星Y,当【x的评级比Y高】的票数高于【Y的评级比X高】的票数。若一个候选球星强于任一其他候选球星时,则成该球星为"球王"。根据这个规则,至多只会有一个球王。需要注意的是也可能没有球王。
输入描述:
第一行包含2个整数N,M,分别表示候选球星数量以及选票数量。
接下来有M行,每行是一个长度为N的字符串,每个字符串表示一张选票上的信息,每个字符串的第k(0<=k<N)个字符,表是这张选票对第k个候选球星的评级。
数据范围:
1<=N<=50
1<=M<=50
字符串值包含小写英文字母(a-z)
输出描述:
若有球王,则输出一行仅包含一个整数x,表示编号为x(a<=x<N)的候选球星是球王;若没有球王,则输出一行仅包含一个整数-1。
eg:
输入:
4 3
acbd
bacd
bdca
输出:
0

代码如下:

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

int main()
{
	vector<string> str;
	string str1;
	int n, m;//n个球星m张选票
	int king=0;
	int flag = 0;//判断是否有相等的状况
	cin >> n >> m;
	for (int i = 0; i < m; i++)
	{
		cin >> str1;
		str.push_back(str1);
	}
	vector<char> max;
	for (int i = 0; i < m; i++)
	{
		max.push_back(str[i][0]);
	}
	for (int j = 1; j < n; j++)
	{
		int num1 = 0;//前者等级高的票数
		int num2 = 0;//后者等级高的票数
		for (int i = 0; i < m; i++)
		{
			if (max[i] < str[i][j])
				num1++;		
			else if (max[i]>str[i][j])
				num2++;
		}
		if (num1 < num2)//max等级低则将max更新
		{
			max.clear();
			flag = 0;
			king = j;
			for (int k = 0; k < m; k++)
			{
				max.push_back(str[k][j]);
			}
			
		}
		else if (num1 == num2)
			flag = 1;
	}
	if (flag == 1)
		cout<<"-1"<<endl;
	else
		cout << king << endl;
	return 0;

}

3、运输货物

有N个货物(0<=N<=1024),每个货物的重量是w(100<=w<=300).如果每辆车最多的载重为300,请问最少需要多少辆车才能运输所有货物。
输入描述:
一行输入,包含N个正整数,表示每个货物的重量,空格分隔。
输出描述:
一行输出,包含一个整数,表示需要的的车辆数。
eg:
输入:130 140 150 160
输出:2
代码如下:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
	vector<int> weight;
	int num;
	int len = 0;
	int cnt = 0;

	while (cin >> num)
	{
		weight.push_back(num);
		len++;
		if (cin.get() == '\n')
			break;
	}

	sort(weight.begin(), weight.end());
	int i = 0;
	int j = len - 1;

	while (i <=j)
	{
		if (weight[i] + weight[j] > 300)
		{
			j--;
			cnt++;
		}
		else if (weight[i] + weight[j]>200 && weight[i] + weight[j]<=300)
		{
			i++;
			j--;
			cnt++;
		}
		else
		{
			cnt += (j - i) / 3 + 1;
		}
	}
	cout << cnt << endl;
	return 0;
}

4、电话号码
题目描述:

A过的手机号码由且仅由N为十进制数字(0-9)组成。一个手机号码中至少有k位数字相同则被定义为靓号。A过的手机号可以有前导零,比如000123456是一个合法的手机号。小多想花钱将自己的手机号码修改为一个靓号。修改号码中的一个数字需要花费的金额为新数字与旧数字之间的差值。比如讲1修改为6或将6修改为1都需要花5块钱。
给出小多现在的手机号码,请问将其修改为一个靓号最少需要多少钱?

输入描述:
第一行包含2个整数N,K,分别表示手机号码数字个数以及靓号至少有k个数字相同。
第二行包含N个字符,每个字符都是一个数字('0'-'9'),数字之间没有任何其他空白符。
表示小多的手机号码。
数据范围:
2<=k<=n<=10000

输出描述:
第一行包含一个整数,表示修改成一个靓号,最少需要的金额。
第二行包含N个数字字符,表示最少花费修改的新手机号,若有多个靓号花费都最少,则输出字典序最小的靓号。

eg:
输入:
6 5
787585
输出:
4
777577

代码如下:(通过率只有15%,还没有找到问题)

#include<iostream>
#include<string>
#include<cmath>

using namespace std;

int main()
{
	int n = 0;
	int k = 0;
	int pnum[1000] = {0};
	int pnum_temp[1000] = { 0 };
	char ch;
	int mnum = 0;
	int temp = 0;
	int fnum[1000] = { 0 };
	int flagnum[1000] = { 0 };
	int min = 0;
	int minlocal = 0;
	cin >> n >> k;
	for (i = 0; i < n; i++)
	{
		cin >> ch;
		pnum[i] = ch - '0';
	}
		for (int i = 0; i < 10; i++)
		{
			for (int j = 0; j < n; j++)
			{
				flagnum[j] = abs(pnum[j] - i);
				pnum_temp[j] = pnum[j];

			}
			temp = 0;
			for (int q = 0; q < k; q++)
			{
				min = flagnum[q];
				minlocal = 0;
				for (int m = n - 1; m >= 0; m--)
				{
					if (min > flagnum[m])
					{
						min = flagnum[m];
						minlocal = m;
					}
				}
				temp = temp + abs(pnum[minlocal] - i);
				pnum_temp[minlocal] = i;
				flagnum[minlocal] = 10;
			}
			if (i == 0)
			{
				mnum = temp;
				for (p = 0; p < n; p++)
				{
					fnum[p] = pnum_temp[p];
				}
			}
			else
			{
				if (mnum > temp)
				{
					mnum = temp;
					for (p = 0; p < n; p++)
					{
						fnum[p] = pnum_temp[p];
					}
				}
			}
		}
		cout << mnum << endl;
		for (int i = 0; i < n; i++)
		{
			cout << fnum[i];
		}
		cout << endl;
		return 0;
	}

猜你喜欢

转载自blog.csdn.net/qq_39095329/article/details/81186897