A
单调栈板子题,没用单调栈做过了的同学,是我的数据水了。建议重写单调栈算法,不然在正式比赛中是会被卡的
B
本场签到题,很多同学想复杂了
题目已经说了
那么,可以知道输入的数其实就是1~n的某排列,排序后,肯定就是1 2 3…n,这样的形式
要求第k大数,直接输出n-k+1即可
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k,x;
scanf("%d",&n);
for(int i=0; i<n; i++) scanf("%d",&x);
scanf("%d",&k);
printf("%d\n",n-k+1);
return 0;
}
C
这道题考察快排的应用,看到有同学用函数过了,如果自己没理解快排思想,不会手写快排,很可能会吃亏的,快排在面试中也经常考
参考代码
#include<bits/stdc++.h>
using namespace std;
const int N = 8e6+9;
int a[N];
int qsort(int l,int r,int k)
{
if(l>=r) return a[l];
int mid = l+r>>1;
int x=a[mid],i=l-1,j=r+1;
while(i<j)
{
//x=a[mid];
do i++; while(a[i]<x) ;
do j--; while(a[j]>x) ;
if(i<j) swap(a[i],a[j]);
}
int n=j-l+1;
if(k<=n) qsort(l,j,k);
else qsort(j+1,r,k-n);
}
int main()
{
int n,k;
cin>>n>>k;
for(int i=0; i<n; i++) scanf("%d",a+i);
printf("%d", qsort(0,n-1,k));
return 0;
}
D
bfs板子题,注意多组输入,标记数组清零,和边界条件
参考代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+9;
int vis[N];
struct node
{
int x,t;//所在位置,花费时间
};
int bfs(int s,int e)//起点,终点
{
queue<node> q;
q.push({s,0});
memset(vis,0,sizeof vis);
vis[s]=1;
while(q.size())
{
node tmp=q.front();
q.pop();
if(tmp.x==e) return tmp.t;
for(int i=0; i<3; i++)
{
int nx;
if(i==0) nx=tmp.x-1;
else if(i==1) nx=tmp.x+1;
else if(i==2) nx=tmp.x*2;
if(nx<0||nx>N) continue;
if(!vis[nx])
{
vis[nx]++;
q.push({nx,tmp.t+1});
}
}
}
}
int main()
{
int n,k;
while(cin>>n>>k)
{
int ans=bfs(n,k);
cout<<ans<<endl;
}
return 0;
}
F
上次的题,归并排序求逆序对,必须掌握的基本算法
留言
大家认真补题吧,说不定下次又考了这次的呢
这是一场比赛,能反映你的训练情况
这也只是一场比赛而已,没打好也没关系,下次证明自己