2022.8.20美团、网易、科大讯飞笔试编程

美团

20单选(语法、系统、数据库、数据结构),10多选(智力、数学),2编程,还有一道没分的论述题

第一题:烤串

题目描述
小团想要自己来烤串!不过在烤串之前,需要串好烤串。小团有n个荤菜和n个素菜,他想按顺序分别一个荤菜一个素菜串起来,想请你帮他串好!
给出两个长度分别为n的仅包含小写英文字母的串A和B,分别代表荤菜和素菜的种类(用字母来表示菜的种类)。请你以从左到右的顺序依次串好他们!例如对于荤菜串A1A2…An
和素菜串B1B2…Bn,串好应该是A1B1A2B2…AnBn

输入描述

第一行一个正整数n,表示烤串长度
第二行为一个长度为n的字符串A,表示荤菜按次序都是哪些菜。
第三行为一个长度为n的字符串B,表示素菜按次序都是哪些菜。
对于80%的数据,n≤1000
对于20%的数据,n≤50000
对于所有数据,A和B为仅包含小写英文字母的字符串。

输出描述

输出一行,包含2n个字符串表示串好的烤串。

非常简单,直接遍历合并

#include 
#include 
using namespace std;

int main()
{
    int n;
    cin >> n;
	string A, B;
	cin >> A >> B;
	string res(2 * n);
	for(int i = 0; i < n; ++i){
		res.push_back(A[i]);
		res.push_back(B[i]);
	}
	cout << res << endl;
	return 0;
}




第二题:最高效率的复习

题目描述
小美将要期中考试,有n道题,对于第i道题,小美有pi的几率做对,获得ai的分值,还有(1-pi)的概率做错,得0分。
小美总分是每道题获得的分数。
小美不甘于此,决定突击复习,因为时间有限,她最多复习m道题,复习后的试题正确率为100%。
如果以最佳方式复习,能获得期望最大总分是多少?

输入n、m
接下来输入n个整数,代表pi%,为了简单期间,将概率扩大了100倍。
接下来输入n个整数,代表ai,某道题的分值
输出最大期望分值,精确到小数点后2位

输入描述

2 1
89 38
445 754

输出描述

1150.05

思路
贪心,先算出每道题的期望分数,再根据m优先复习分值大的使其达到100%分值
(做题时没考虑精度范围,太蠢了给了个int,直接累加应该用long long的)

#include 
#include 
#include    // sort
#include 
#include    // greater
#include     // setprecision
using namespace std;

typedef long long ll;
int main()
{
	int n, m;
	cin >> n >> m;
	vector<ll> p(n, 0);    // 做对i题的概率
	vector<ll> a(n, 0);    // 每题对应的分数
	for (auto& e : p) cin >> e;
	for (auto& e : a) cin >> e;
	for (int i = 0; i < n; ++i) {
		p[i] *= a[i];
	}
	for (int i = 0; i < n; ++i) {
		a[i] = a[i] * 100 - p[i];
	}
	sort(a.begin(), a.end(), greater<ll>());
	ll ans = 0;
	for (int i = 0; i < n; ++i) {
		ans += p[i];
	}
	for (int i = 0; i < min(n, m); ++i) {
		ans += a[i];
	}
	double ret = (double)ans / 100.;
	 // 精确到小数点两位
	cout << fixed << setprecision(2) << ret << endl;
	return 0;
}
	
	/*
	for (int i = 0; i< n; ++i)
		cin >> p[i];
	for (int i = 0; i < n; ++i)
		cin >> val[i];

	unordered_map point;
	for (int i = 0; i < n; ++i){
		point[val[i]] = (double)(val[i] * p[i]) / 100;
	}
	sort(val.begin(), val.end());
	for (int i = 0, j = val.size() - 1; i < m && j >= 0; ++i, --j){
		point[val[j]] = (double)val[j] * 1.00;   // 100%
	}
	double res = 0;
	for (int i = 0; i < n; ++i){
		res += point[val[i]];
	}

	printf("%.2lf\n", res);

	return 0;
}*/








网易

第一题

题目描述
小红拿到了两个正整数a和b,她每次操作可以选择其中个正整数,删除个数位。例如,对于"1243"而言,进行一次操作可以生成"124"、“123”、 “143"或"243”。
小红希望最终a是b的倍数或者b是a的倍数。她想知道自己最少的操作次数是多少?
输入2个数a b,其中a,b<=1e9
输出最少的操作次数。

输入描述

1234 99

输出描述

2

第二题

题目描述
嘤嘤觉得长城很美 ,特别是它的锯齿, 非常的优雅!
现在有一个数组,嘤嘤想把这个数组变成"长城",即对于"长城"中每 一个元 素左右两边的元素相等,并且与它不相等。例如[2,1,2,1,2,1,2),(1,9,1,9}是长城,{2,1,3,2,4,1,4,4,4,4)则不是长城。
你每次可以将一个元素加一,请问最少需要几次操作?

输入n和n个正整数。其中n<=2e5,ai<=1e9。

输入描述

6
1 1 4 5 1 4

输出描述

11

第三题

题目描述
小红拿到了一个仅由r’、‘e’、'd’组成的字符串, 她定义一个字符’e’为"好e"当 且仅当这个’e’字符既和r相邻也和’d’相邻。 例如"reeder"只有一个"好e",前 两个’e’都不是"好e",只有第三个’e’是"好e"。
小红每次可以修改一个字符(可以将任意字符修改)为任意字符,即三种类型的字符可以相互修改) ,她希望最终"好e"的数量尽可能多。小红想知道,自己最少要修改多少次?
输入一个只有red三中字符的字符串,长度<2e5。
输出最小修改次数

输入描述

derrd

输出描述

1

第四题:拟合

题目描述
小红拿到了一个数组 a1…an,她想知道有多少组(i, j, k)为"v三元组":第一个数和第三个数相等。且第一个数大于第二个数。
用数学语言描述:
1<=iaj
输入n<1e5, ai<=1e9。

输入描述

6
3 1 3 4 3 4

输出描述

3

你可能感兴趣的:(算法,数据结构)