2023-9.12 百度 移动软件 笔试
被锁简历了,还是提前批投的,有点无奈。
选择基本都是蒙的。
第一题:
思路:把构造序列,转化成求类似于最长上升子序列的过程,当然并不需要真的求出来。
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
void solve()
{
int n;cin>>n;
vector<int>a(n+1,0);
for(int i=1;i<=n;i++)cin>>a[i];
int cur=0;
int idx=0;
while(idx<(int)a.size())
{
while(idx<(int)a.size()&&a[idx]!=cur+1)idx++;
if(a[idx]==cur+1)idx++,cur++;
}
cout<<(cur?n-cur:-1)<<endl;
return ;
}
int main()
{
freopen("test.in","r",stdin);
solve();
return 0;
}
第二题:
最开始没读懂题,后来理解了以后,发现其实原始任务的操作是固定的,因此只需要考虑如何插入即可。
过程抽象出来就是,区间修改,然后查询区间最大值
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
#define int long long
#define l first
#define r second
int st[N][32];
void init(vector<int>&a)
{
int n=(int)a.size()-2;
for(int j=0;j<=(int)log2(n);j++)
for(int i=1;i+(1<<j)-1<=n;i++)
if(!j)st[i][j]=a[i];//i+(1<<j)-1-x+1=1<<(j-1)
else st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
void solve()
{
int n,m,k,t;
cin>>n>>m>>k>>t;
vector<int>a(n+2,0);
vector<pair<int,int>>op(m+1);
for(int i=1;i<=m;i++)cin>>op[i].l;
for(int i=1;i<=m;i++)cin>>op[i].r;
for(int i=1;i<=m;i++)
{
int l=op[i].l,r=op[i].r;
a[l]++,a[r+1]--;
}
for(int i=1;i<=n;i++)a[i]+=a[i-1];//差分数组
init(a);
int ans=0;
for(int i=1;i+k-1<=n;i++)
{
int l=i,r=i+k-1;//
int len=(int)log2(r-l+1);
int maxv=max(st[l][len],st[r-(1<<len)+1][len]);
if(maxv<t)ans++;
}
cout<<ans<<endl;
return ;
}
//t=2 k=3
//1 1 1 2 2 1 1 1 1 1
//
signed main()
{
freopen("test.in","r",stdin);
solve();
return 0;
}
#提前批简历挂麻了怎么办##牛客创作赏金赛##我的2024小目标##求职遇到的搞笑事件##机械制造笔面经#


查看17道真题和解析