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小目标##求职遇到的搞笑事件##机械制造笔面经#
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务