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[n−1],f[n−2],f[n−3],f[n−4] 中取一个最大的,本来以为会 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++后端开发笔试 | 编程部分的主要内容,如果未能解决你的问题,请参考以下文章