Bilibili校招C++后端开发笔试 | 编程部分

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bilibili校招C++后端开发笔试 | 编程部分相关的知识,希望对你有一定的参考价值。

编程

T1 最大正方形

思路

因为数据范围 1 e 5 1e5 1e5 我们只需要排序后从大到小枚举一下这个正方形的边长即可,然后拿这个边长去与这 n n n 个方块的高度做对比,找到第一个大于等于枚举的高度的位置,看一下这个位置是否合法(当前是否能组成正方形,肯定是从当前位置到最大元素的位置差大于等于边长,并且当前的方块也是要大于等于边长的)

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5+10;

int a[N],n;

int main()

	cin>>n;
	for(int i = 0;i < n; ++i) cin>>a[i];
	sort(a,a+n);
	for(int i = N;i >= 1; --i) 
		int loc = lower_bound(a,a+n,i) - a;
		int tt = loc;
		loc = n - loc;
		if(loc >= i && a[tt] >= i) 
			cout<<min(loc,a[tt])<<endl;
			return 0;
		
	
	
	return 0;

T2 小y过池塘

思路

前言:只通过了56%

看了一眼感觉是动态规划,设 f [ i ] f[i] f[i] 为跳到 i i i 点的最大价值 ,从 2 2 2 的倍数项位置转移过来,或者是从 5 5 5 的倍数项的位置转移过来,那么不难得到如下转移方程

f [ i ] = m a x ( f [ j ] + a [ i ] , f [ [ i ] ) f[i] = max(f[j] + a[i],f[[i]) f[i]=max(f[j]+a[i],f[[i])

然后答案就是从 f [ n ] , f [ n − 1 ] , f [ n − 2 ] , f [ n − 3 ] , f [ n − 4 ] f[n],f[n-1],f[n-2],f[n-3],f[n-4] f[n],f[n1],f[n2],f[n3],f[n4] 中取一个最大的,本来以为会 TLE ,但是不知道为啥 WA

代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long

const ll N = 1e5+10;

ll a[N],n,f[N];

int main()

	cin>>n;
	for(ll i = 1;i <= n; ++i) cin>>a[i];
	
	memset(f,-0x3f,sizeof f);
	f[0] = 0;
	f[1] = a[1];
	f[2] = a[2];
	f[3] = a[3] + f[1];
	f[4] = max(f[2] + a[4],a[4]);
	f[5] = a[5];
	ll ans = -0x3f3f3f3f3f3f3f3f;
	for(ll i = 6;i <= n; ++i) 
//		for(ll j = i - 2,k = 2;j >= 0; ++k,--j) 
//			if(k % 2 == 0 || k % 5 == 0)
//				f[i] = max(f[j] + a[i],f[i])
//		
		for(ll j = i - 2;j >= 0; j -= 2) 
			f[i] = max(f[j] + a[i],f[i]);
		
		for(ll j = i - 5,k = 1;j >= 0; j -= 5,k++) 
			if(k % 2)
				f[i] = max(f[j] + a[i],f[i]);
		
	
	for(ll j = 0;j <= 4; ++j) 
		ans = max(ans,f[n - j]);
	cout<<ans<<endl;
	
	
	return 0;

以上是关于Bilibili校招C++后端开发笔试 | 编程部分的主要内容,如果未能解决你的问题,请参考以下文章

京东校招笔试(C++方向)编程题

头条18年校招后端开发工程师编程题解析

2022届互联网公司校招后端技术研发笔试

小红书C++后端开发笔试

小红书C++后端开发笔试

校招C++笔试ACM模式输入处理