第一题
知识点 STL deque
- 引入 #include <deque>
- 申明 deque<int> aq;
- aq.pop_back() 弹出最后一个元素
- aq.pop_front() 弹出最前面一个元素
- aq.front() 获得aq首元素
- aq.back()获得aq末元素
- 与vector的区别在于 deque能够方便进行首位操作
STL 各种容器的区别参见:C++三种容器:list、vector和deque的区别_c++ list可以存对象指针么-CSDN博客
解题思路:
- 控制一个单调队列,从i=1 到 n+k的循环中只能让比a[i]小的下标进入队列
- 将所有超出滑动窗口的下标排除出队列
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
const int Num=2e6+10;
int a[Num];
int main(){
int n;
cin>>n;
deque<int> aq;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int k;cin>>k;
for(int i=n+1;i<=n+k;i++){
a[i]=2*Num;
}
for(int i=1;i<=n+k;i++){
while(!aq.empty() && a[aq.back()]>a[i]) aq.pop_back();
aq.push_back(i);
while(i-2*k>aq.front()) aq.pop_front();
if (i>k) cout<<a[aq.front()]<<" "; //从i等于1 开始最少也要比较k次所以当i>k时输出
}
return 0;
}
第二题
知识点:动态规划、用dfs进行暴力搜索
解决方案一:用dfs暴力求解
以下代码均来源于蓝桥杯对应题目下题解!!!注意理解dfs多分支共用一个变量,变量值的问题!!!
#include <iostream>
using namespace std;
int ans = 0;
void dfs(int k, int sum)
{
if(sum == 100 || k >= 31) //100分的时候停止答题
return ;
if(sum == 70) //只要70分就记录答案,小明可能会中途放弃...可能家里有事了吧,注意中途放弃,这个很关键嗷,要不会少情况
//每进行一次dfs sum在每个dfs分支下面的值不一样 !!!妙得很!!!
ans++;
dfs(k + 1, sum + 10);
dfs(k + 1, 0); //答错归0
}
//总共30到题目,答对10分,打错归0分
int main()
{
dfs(0, 0);
cout << ans<< endl;
return 0;
}
解决方案二:用动态规划求解
public class Main {
static int N = 35, M=110;
static long[][] f = new long[N][M];
public static void main(String[] args) {
int n = 30, m =100;
f[1][0] = 1; f[1][10] = 1;
for(int i=2; i<=n; i++){
for(int j=0; j<=100; j+=10){
//得分为0代表至少答错一题,所以这里我们只要最后一题答错就可以了
if(j==0){
for(int k=0; k<=90; k+=10) f[i][j] += f[i-1][k];
}else{
f[i][j] = f[i-1][j-10];
}
}
}
long ans = 0;
for(int i=1; i<=n; i++) ans += f[i][70];
System.out.println(ans);
}
}