每日刷题日记 3.30 滑动窗口

文章介绍了C++STL中的deque容器在处理单调队列问题中的应用,以及如何使用dfs和动态规划解决蓝桥杯中的分数决策问题。
摘要由CSDN通过智能技术生成

第一题

知识点   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);
    }
}

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 电脑DOS系统3.30是一种旧版本的操作系统,是在电脑发展初期使用的。它是微软公司开发的一种操作系统,用于控制计算机硬件和执行用户任务。 DOS系统3.30最主要的特点是命令行界面,也就是用户需要通过输入指令来操作计算机。相对于现代操作系统的图形用户界面,DOS系统3.30的操作方式相对较为繁琐。 DOS系统3.30的功能相对较为简单,主要包括文件管理、磁盘管理、内存管理和程序加载等。用户可以使用一些基本的指令来创建、复制、删除和移动文件,进行磁盘格式化和分区操作,以及限制程序的内存使用。 然而,DOS系统3.30也存在一些不足之处。首先,由于其命令行界面的限制,用户需要了解和记忆大量的指令才能有效操作系统。其次,DOS系统3.30对图形和多媒体等方面的支持相对较差,限制了其应用范围。最重要的是,DOS系统3.30在多任务处理和网络连接等方面功能不完善,无法满足现代计算机用户的需求。 尽管DOS系统3.30已经过时,但它在计算机发展历程中扮演了重要的角色。它为后来的操作系统提供了一定的基础,使得计算机技术能够逐步发展和完善。虽然我们现在很少使用DOS系统3.30,但它依然值得我们了解和尊重。 ### 回答2: DOS(磁盘操作系统)是早期个人电脑上广泛使用的操作系统,它的版本有很多种。而"DOS系统3.30"可以理解为指的是DOS的一个特定版本,即DOS 3.30。 DOS 3.30是由微软公司于1987年发布的一款操作系统。与此前的DOS版本相比,DOS 3.30引入了一些新特性和改进,提升了系统的稳定性和功能性。 首先,DOS 3.30改进了对硬盘的支持。它引入了新的文件系统FAT(文件分配表),使得硬盘的储存空间得到更有效地利用,提高了文件的管理效率。 其次,DOS 3.30加强了对多任务处理的支持。它可以在同一时间运行多个程序,通过时间分片的方式轮流切换程序的执行,实现了类似的多任务效果。 另外,DOS 3.30还改进了对内存的管理。它引入了扩展内存(Extended Memory)的概念,可以利用超过640KB的内存空间,增大了可用内存的容量。 此外,DOS 3.30加入了一些新的命令和工具,使得用户在操作系统上的使用更加方便。例如,它提供了更多的文件操作命令,如复制、移动和删除文件等,以及一些实用工具,如磁盘检测与修复工具。 总的来说,DOS 3.30是一个在功能和性能上有所提升的操作系统版本,它对硬盘支持、多任务处理和内存管理进行了改进。虽然在如今的计算机领域已经过时了,但在当时,它是非常重要的一步,为个人电脑的发展奠定了基础。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值