排队选人-2024年秋招-小米集团-软件开发岗-第二批笔试
题目分析:区间极值问题(极小值),此题目长度为k的区间极小值不能小于a。
区间极值问题有三种方法:
(1)序列中元素的值可变,线段树(已忘记怎么写)。
(2)序列中元素不可变,RMQ数组
(3)此题目由于区间长度固定为k,且仅为小米招聘算法第一题,因此使用数据结构课程中的set结构来解决。set简单说就是一个有序集合,我们用set存储一个长度为k区间所有元素,区间向后移动时删除最左侧元素,加入最右侧元素。
小提示:此处可能有重复元素,因此使用multiset结构,另外set集合最小值用begin()函数可得。
使用set结构需要注意,最大值是end()函数前驱,所以需要指针前移,也就是--sa.end()才是最大元素.
#include <bits/stdc++.h>
using namespace std;
int main()
{int n,k,a,b,i,j,x,d1[100005]={0},d2[100005]={0},ans=0;cin>>n>>k>>a>>b;for(i=1;i<=n;i++)cin>>d1[i];for(i=1;i<=n;i++)cin>>d2[i];multiset<int> sa,sb;for(i=0;i<k;i++)/**< 此处多放了1个零进去 */sa.insert(d1[i]),sb.insert(d2[i]);for(i=k;i<=n;i++){/**< 集合中保持k个元素,放入第i个,拿走第i-k个*/sa.erase(d1[i-k]);sb.erase(d2[i-k]);sa.insert(d1[i]);sb.insert(d2[i]);if(*sa.begin()>=a&&*sb.begin()>=b)ans++;/**< 集合中begin()获取最小值,end()获取最大值 */}cout<<ans;return 0;
}
