每日一题——博弈论(枚举与暴力)

简介: 每日一题——博弈论(枚举与暴力)

博弈论

题目描述

运行代码

#include<iostream>
#include<vector>
using namespace std;
int main(){
  int n;
  cin >> n;
  vector<int> d(n,0);
  for(int i = 0;i < n;i++){
    cin >> d[i];
  }
  vector<int> in(1000,0);
  for(int k = 1;k<=3;k++){
    for(int i=0;i<=n-k;i++){
      int t = 0;
      for(int j=i;j<i+k;j++){
        t = 10*t+d[j];
      }
      in[t] = 1;
    }
  }
  for(int i = 0;i < 1000;i++)
    if(in[i] == 0){
      cout << i << endl;
      return 0;
    }
  return 0;
}

代码思路

  1. 输入处理:
  • 首先,程序接收一个整数n,表示数字序列的长度。
  • 然后,程序读取接下来的n个整数并存储在一个名为dvector(动态数组)中。
  1. 初始化标记数组:创建一个大小为1000的vector in,并将其所有元素初始化为0。这个数组用来标记长度为1至3位的整数是否在给定序列中出现过。由于最大的3位数是999,因此1000的大小足够覆盖所有可能的情况。
  2. 检查数字序列:对于长度为1、2、3的子序列,程序遍历所有可能的起始位置i:计算从位置i开始,长度为k(当前循环的长度)的子序列对应的整数t。这是通过将子序列中的每个数字乘以相应位值(10的幂)并求和得到的。将计算出的整数tin数组中标记为1,表示这个数值已经在输入序列中出现过了。
  3. 寻找未出现的最小整数:
  • 遍历in数组,找到第一个值为0的元素的索引,这代表了未在输入序列中出现过的最小正整数。
  • 一旦找到这样的索引,立即输出该索引(即对应的整数),并结束程序。
  1. 返回:如果遍历完整个in数组都没有找到未出现的整数(理论上这种情况不应该发生,但代码逻辑没有直接处理这种特殊情况),程序会正常结束。

改进思路

  1. 减少内存使用:目前使用了一个大小为1000的vector来标记数字是否出现,其实最大只需要到n的长度变化的所有组合即可,特别是当n远小于3时。可以通过动态调整in的大小或者使用更高效的数据结构如setunordered_set来改进。
  2. 优化寻找未出现数字的步骤:当前实现是线性查找in数组中值为0的第一个元素,若大多数数字都已出现,则效率较低。可以在遍历过程中直接记录第一个未出现的数字,减少后续查找步骤。
  3. 增加对极端情况的处理:例如,当输入序列为空或全为0时,原始代码可能表现得不够直观或正确。

改进代码

#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
 
int main() {
    int n;
    cin >> n;
    vector<int> d(n, 0);
    
    // 输入数字序列
    for (int i = 0; i < n; ++i) {
        cin >> d[i];
    }
    
    // 使用unordered_set存储已出现的数字,自动去重且查找效率高
    unordered_set<int> appeared;
    
    // 检查数字序列,添加长度为1到3的数字到集合中
    for (int k = 1; k <= min(3, n); ++k) { // 添加边界条件避免n<k时的无效迭代
        for (int i = 0; i <= n - k; ++i) {
            int t = 0;
            for (int j = i; j < i + k; ++j) {
                t = 10 * t + d[j];
            }
            appeared.insert(t);
        }
    }
 
    // 寻找未出现的最小正整数
    int i = 1;
    while (appeared.find(i) != appeared.end()) {
        ++i;
    }
    cout << i << endl;
 
    return 0;
}
  1. 通过使用unordered_set来存储已出现的数字,提高了查找未出现数字的效率。
  2. 通过直接在遍历过程中寻找未出现的最小整数,避免了最后单独的查找循环,使得代码更加简洁。
  3. 增加了对输入序列长度的边界检查,确保了代码的健壮性。
注意点:

改进代码为AI生成,并且这个代码的数据通过率97%,无法通过所有测试数据

目录
相关文章
|
并行计算 数据挖掘 数据处理
【软件设计师备考 专题 】CISC RISC,流水线操作,多处理机,并行处理
【软件设计师备考 专题 】CISC RISC,流水线操作,多处理机,并行处理
331 0
|
分布式计算 资源调度 Hadoop
HBase表数据的读、写操作与综合操作
HBase表数据的读、写操作与综合操作
297 0
|
弹性计算
新手必看,阿里云国际购买服务器带宽如何选择
新手必看,阿里云国际购买服务器带宽如何选择
|
安全 应用服务中间件 网络安全
Python 渗透测试:漏洞的批量搜索与利用.(GlassFish 任意文件读取)
Python 渗透测试:漏洞的批量搜索与利用.(GlassFish 任意文件读取)
229 11
|
小程序 前端开发 Java
社区生鲜团购小程序
社区生鲜团购小程序
967 0
|
弹性计算 运维 Kubernetes
Serverless 应用引擎 SAE 助力袋拉拉研发提效 70%
机汽猫的主要业务是通过部署 IoT 设备解决医院耗材管理问题。面对业务的潮汐特性带来的资源预留难题与运维压力,该公司选择将所有应用部署在阿里云 Serverless 应用引擎 SAE上。SAE 提供的微服务治理、自适应弹性伸缩及平台工程化能力,助力机汽猫研发效率提升了 70%。
|
SQL 大数据
常见大数据面试SQL-每年总成绩都有所提升的学生
一张学生成绩表(student_scores),有year-学年,subject-课程,student-学生,score-分数这四个字段,请完成如下问题: 问题1:每年每门学科排名第一的学生 问题2:每年总成绩都有所提升的学生
|
canal 缓存 NoSQL
【后端面经】【缓存】33|缓存模式:缓存模式能不能解决缓存一致性问题?-03 Refresh Ahead + SingleFlight + 删除缓存 + 延迟双删
【5月更文挑战第11天】Refresh Ahead模式通过CDC异步刷新缓存,但面临缓存一致性问题,可借鉴Write Back策略解决。SingleFlight限制并发加载,减少数据库压力,适合热点数据。删除缓存模式在更新数据库后删除缓存,一致性问题源于读写线程冲突。延迟双删模式两次删除,理论上减少不一致,但可能降低缓存命中率。选用模式需权衡优劣,延迟双删在低并发下较优。装饰器模式可用于实现多种缓存模式,无侵入地增强现有缓存系统。
353 2
通过正则表达式获取字符串中的省市区
通过正则表达式获取字符串中的省市区
501 0
通过正则表达式获取字符串中的省市区
|
机器学习/深度学习 自然语言处理 算法
【机器学习】生成对抗网络(GAN)应用领域分析
【1月更文挑战第27天】【机器学习】生成对抗网络(GAN)应用领域分析