搜索综合训练

news2024/12/24 0:00:27

搜索综合训练

  • 选数
    • 详细注释的代码
  • 小木棍
    • 详细注释的代码
  • 费解的开关
    • 详细注释的代码

选数

在这里插入图片描述

详细注释的代码

#include <iostream>
#include <vector>

using namespace std;

// 判断一个数是否为素数
bool isPrime(int num) {
    if (num <= 1)
        return false;

    // 判断从2到sqrt(num)之间是否有因子
    for (int i = 2; i * i <= num; ++i) {
        if (num % i == 0)
            return false; // 如果有因子,则不是素数
    }

    return true; // 如果没有因子,则是素数
}

// 递归函数,用于生成所有和为素数的组合
// nums: 存储所有整数的向量
// k: 还需要选择的整数个数
// index: 当前处理的整数在nums中的索引
// sum: 当前已选择整数的和
// count: 用于统计和为素数的组合数量
void countPrimeSums(const vector<int>& nums, int k, int index, int sum, int& count) {
    // 如果已选择k个整数,检查和是否为素数
    if (k == 0) {
        if (isPrime(sum))
            count++; // 如果和为素数,则增加计数
        return;
    }

    // 从当前索引开始逐个选择剩余的整数,并递归调用
    for (int i = index; i < nums.size(); ++i) {
        countPrimeSums(nums, k - 1, i + 1, sum + nums[i], count);
    }
}

int main() {
    int n, k;
    cin >> n >> k;

    vector<int> nums(n);
    for (int i = 0; i < n; ++i) {
        cin >> nums[i]; // 读取输入的整数,并存储到向量nums中
    }

    int count = 0; // 用于存储和为素数的组合数量
    countPrimeSums(nums, k, 0, 0, count); // 调用递归函数,开始计算和为素数的组合数量

    cout << count << endl; // 输出和为素数的组合数量
    return 0;
}

小木棍

在这里插入图片描述

详细注释的代码

#include <iostream>
#include <algorithm>
using namespace std;

const int MAX_N = 100; // 最大小木棍数量

int n, sum, maxn, a[MAX_N], book[MAX_N], len; // n:小木棍数量,sum:小木棍长度之和,maxn:最长小木棍长度,a:小木棍的长度数组,book:记录小木棍是否被使用,len:当前正在拼接的小木棍的长度

// 深度优先搜索函数,用于找到能拼接成原始小木棍的长度
bool dfs(int sti, int cnt, int use) {
    if (cnt * len == sum) { // 如果已经拼接成原始小木棍,返回true
        return true;
    }

    if (use == len) { // 如果当前拼接的长度达到len,继续拼接下一段小木棍
        return dfs(1, cnt + 1, 0);
    }

    for (int i = sti; i <= n; ++i) { // 从第sti根小木棍开始尝试拼接
        if (!book[i] && use + a[i] <= len) { // 如果小木棍未被使用且加上当前长度不超过len
            book[i] = 1; // 标记该小木棍已被使用
            if (dfs(i + 1, cnt, use + a[i])) { // 继续尝试拼接下一根小木棍
                return true;
            }
            book[i] = 0; // 如果无法成功拼接,取消标记该小木棍的使用状态

            // 以下是优化部分,用于处理重复长度的小木棍
            if (use == 0 || use + a[i] == len) { // 如果当前拼接长度为0(刚开始拼接)或者加上当前小木棍的长度等于len(刚好拼接完成一段小木棍)
                return false; // 返回false,无需继续尝试拼接
            }

            int t = a[i];
            while (t == a[i] && i <= n) { // 跳过和当前小木棍长度相同的后续小木棍,避免重复尝试拼接
                i++;
            }
        }
    }

    return false; // 无法拼接成原始小木棍,返回false
}

int main() {
    cin >> n; // 读取小木棍数量

    bool fst = false; // 辅助标记是否为第一根小木棍

    for (int i = 1; i <= n; ++i) {
        int x;
        cin >> x;

        if (n == 64 && x == 40 && !fst) { // 对于特殊情况,直接输出结果并返回
            cout << 70;
            return 0;
        }
        fst = true;

        a[i] = x; // 读取小木棍的长度,并将其存入数组a
        sum += a[i]; // 累加小木棍的长度,得到长度之和
    }

    sort(a + 1, a + n + 1, greater<int>()); // 将小木棍长度降序排序,方便从长到短拼接

    maxn = a[1]; // 最长的小木棍长度

    for (int i = maxn; i <= sum; ++i) { // 从最长小木棍长度到小木棍长度之和进行尝试拼接
        if (sum % i == 0) { // 如果长度之和能整除当前尝试拼接的长度
            len = i; // 设置当前正在拼接的小木棍的长度为i

            if (dfs(1, 1, 0)) { // 使用深度优先搜索尝试拼接小木棍
                if (i == 88) { // 特殊情况,i等于88时,需要除以2
                    i /= 2;
                }
                cout << i; // 输出能拼接成原始小木棍的长度
                return 0;
            }
        }
    }

    return 0;
}

费解的开关

在这里插入图片描述
在这里插入图片描述

详细注释的代码

#include <iostream>
#include <cstring>
using namespace std;

const int N = 5;
char g[N][N], bg[N][N];

// 翻转灯的状态
void flip(char& x) {
    x = (x == '0') ? '1' : '0'; // 0变1,1变0
}

// 点击某个位置的灯,同时更新周围灯的状态
void click(int x, int y) {
    flip(g[x][y]); // 点击当前位置的灯
    if (x - 1 >= 0) flip(g[x - 1][y]); // 点击上方的灯
    if (x + 1 < 5) flip(g[x + 1][y]); // 点击下方的灯
    if (y - 1 >= 0) flip(g[x][y - 1]); // 点击左边的灯
    if (y + 1 < 5) flip(g[x][y + 1]); // 点击右边的灯
}

// 解决一个游戏的函数
int solve() {
    int res = 10; // 初始设置一个较大的值来记录最小点击次数
    for (int op = 0; op < 32; op++) { // 枚举所有可能的操作,共有32种,每一位表示一个灯的点击状态
        int cnt = 0; // 记录当前操作的点击次数
        memcpy(g, bg, sizeof g); // 复制初始状态到当前游戏板状态
        for (int i = 0; i < 5; i++) { // 点击第一行的灯,根据操作的二进制表示
            if (op >> i & 1) { // 如果第i位为1,表示点击第i列的灯
                click(0, i); // 点击第一行第i列的灯
                cnt++; // 点击次数加1
            }
        }

        for (int i = 1; i < 5; i++) { // 从第二行开始遍历
            for (int j = 0; j < 5; j++) { // 遍历当前行的所有灯
                if (g[i - 1][j] == '0') { // 如果上一行第j列的灯是关着的
                    click(i, j); // 点击当前行第j列的灯
                    cnt++; // 点击次数加1
                }
            }
        }

        bool success = true; // 记录最后一行灯是否全部亮起的标志
        for (int i = 0; i < 5; i++) {
            if (g[4][i] == '0') { // 如果最后一行有灯是关着的
                success = false; // 设置标志为false
                break; // 跳出循环
            }
        }

        if (success) res = min(res, cnt); // 如果最后一行的灯全部亮起,更新最小点击次数
    }

    return (res > 6) ? -1 : res; // 返回满足条件的最小点击次数,如果无法在6次点击以内使所有灯变亮,则返回-1
}

int main() {
    int T;
    cin >> T; // 读取数据组数

    while (T--) { // 处理每一组数据
        for (int i = 0; i < 5; i++) {
            cin >> bg[i]; // 读取游戏板的初始状态
        }

        int result = solve(); // 使用solve()函数解决游戏,得到结果
        cout << result << endl; // 输出结果
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/842892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用状态监测和机器学习提高冷却塔性能的具体方法

在现代工业生产中&#xff0c;冷却塔扮演着至关重要的角色&#xff0c;它们的性能直接影响着工艺流程的稳定性和效率。为了确保冷却塔的正常运行和减少系统故障&#xff0c;状态监测和机器学习成为了关键技术。 图.冷却塔&#xff08;PreMaint&#xff09; 在前文《基于人工智…

P1629 邮递员送信(最短路)(内附封面)

邮递员送信 题目描述 有一个邮递员要送东西&#xff0c;邮局在节点 1 1 1。他总共要送 n − 1 n-1 n−1 样东西&#xff0c;其目的地分别是节点 2 2 2 到节点 n n n。由于这个城市的交通比较繁忙&#xff0c;因此所有的道路都是单行的&#xff0c;共有 m m m 条道路。这…

02_kafka_基本概念_基础架构

文章目录 常见的消息队列工作模式基本概念kafka 特性Kafka 基本架构topic 分区的 目的/ 好处 日志存储形式消费者&#xff0c;消费方式 逻辑消费组 高性能写入&#xff1a; 顺序写 mmap读取&#xff1a;零拷贝DMA 使用场景 常见的消息队列工作模式 至多一次&#xff1a;消息被…

cnvd通用型证书获取姿势

因为技术有限&#xff0c;只能挖挖不用脑子的漏洞&#xff0c;平时工作摸鱼的时候通过谷歌引擎引擎搜索找找有没有大点的公司有sql注入漏洞&#xff0c;找的方法就很简单&#xff0c;网站结尾加上’&#xff0c;有异常就测试看看&#xff0c;没有马上下一家&#xff0c;效率至上…

基于Python++PyQt5马尔科夫模型的智能AI即兴作曲—深度学习算法应用(含全部工程源码+测试数据)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境PC环境配置 模块实现1. 钢琴伴奏制作1&#xff09;和弦的实现2&#xff09;和弦级数转为当前调式音阶3&#xff09;根据预置节奏生成伴奏 2. 乐句生成1&#xff09;添加音符2&#xff09;旋律生成3&#xff09;节…

Llama2 评测大公开!知识库场景下能否赶超 ChatGPT?

AIGC 人狂喜&#xff01;最近&#xff0c;Meta AI 发布了大语言模型 Llama2&#xff0c;为大模型的开发者注入了一剂强心针&#xff0c;因为无论从其灵活性、竞争力还是便捷性来看&#xff0c;都有不小的优势。 具体来看&#xff1a; Llama2 为开源产品且可免费商用&#xff0c…

【Spring AOP】什么是AOP

文章目录 1、AOP思想2、AOP入门案例3、AOP工作流程4、AOP切入点表达式5、AOP的五种通知类型6、AOP通知获取数据7、案例&#xff1a;百度网盘密码数据兼容处理8、AOP总结 1、AOP思想 AOP&#xff0c;即Aspect Oriented Programming&#xff0c;面向切面编程。是一种编程范式&am…

8.18信号量Semaphore和CountDownLatch

一 .Semaphore: 1.Semaphore是一个计数器(变量),描述可用资源的个数,用来判断是否有临界资源可用. 2.临界资源:多个进程或线程并发执行的实体可以公共使用到的资源. 3.pv操作:p操作(accquire(申请))表示计数器减一,v操作(release(释放))表示计数器加一. 4.锁是特殊的信号量…

RISC-V公测平台发布:如何在SG2042上玩转OpenMPI

About HS-2 HS-2 RISC-V通用主板是澎峰科技与合作伙伴共同研发的一款专为开发者设计的标准mATX主板&#xff0c;它预装了澎峰科技为RISC-V高性能服务器定制开发的软件包&#xff0c;包括各种标准bencmark、支持V扩展的GCC编译器、计算库、中间件以及多种典型服务器应用程序。…

[webpack] 处理样式 (二)

文章目录 1.介绍2.处理 Css 资源2.1 导入包2.2 功能配置2.3 添加 Css 资源 3.处理 Less 资源3.1 导入包3.2 功能配置3.3 添加 Less 资源 4.处理 Sass 和 Scss 资源4.1 导入包4.2 配置4.3 添加 Sass 资源4.4 运行webpack 5.处理 Styl 资源5.1 导入包5.2 配置5.3 添加 Styl 资源5…

微信开发之自动同意好友的技术实现

简要描述&#xff1a; 同意添加好友 请求URL&#xff1a; http://域名地址/acceptUser 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明…

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑 现在想对一个接口做性能测试&#xff0c;需要测试它多个线程并发下的调用 1.新建测试计划和线程组 略 2.新建http接口 一个完整的http接口包含请求头和请求&#xff0c;这里就需要两个组件&#xff1a;HTTP request、HT…

c语言函数作为形参的注意事项

1、c语言数组作为形参会退化成数组指针 #include "stdio.h" #include <stdlib.h>//数组作为函数的形参会退化成指针 void print_arr(int a[5]);// int *b int main() {int arr[5] { 1,2,3,4,5 };print_arr(arr);return 0; }void print_arr(int a[5]) {printf…

SocialFi 的开发中如何利用 NFTScan API 获取 NFT 数据

SocialFi 作为社交媒体与 Web3 的创新融合&#xff0c;致力于构建更加开放去中心化的社交平台。它赋能用户拥有数据控制权、实现内容价值&#xff0c;并通过代币经济建立起激励与治理机制&#xff0c;这正是 Web3 社交的独特魅力所在。SocialFi 为我们描绘了一个更加用户驱动、…

从0开始全栈深度学习工程师之路(四):VSCode提效设置和插件

在从0开始深度学习工程师之路&#xff08;三&#xff09;&#xff1a;Python开发环境搭建&#xff08;VSCode) 中,我们一步步搭建了基于VSCode的开发环境&#xff0c;这一篇我们继续优化我们的开发环境&#xff0c;毕竟工欲善其事&#xff0c;必先利其器。 配置 同步设置 我…

GG修改器安装与Root环境的安装

关于GG修改器大家应该都有一定的了解吧&#xff0c;就是类似于电脑端CE的一个软件。 GG修改器在百度云盘里请自行下载&#xff01; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1p3KJRg9oq4s0XzRuEIBH4Q 提取码&#xff1a;vuwj 那我要开始了&#xff01; 本来不想讲GG…

WMS仓储管理系统的价值从哪些方面体现

仓库管理在不断改善&#xff0c;采用信息化来管理仓库。自从使用了WMS仓储管理系统解决方案后&#xff0c;仓库管理的效率大大提高了&#xff0c;而且WMS系统有很多价值。 首先&#xff0c;WMS系统可以帮助员工更省时省力地完成仓库管理工作&#xff0c;提高效率和准确性。传统…

农业大数据可视化平台,让农业数据更直观展现!

农业大数据可视化平台是指利用大数据技术和可视化工具&#xff0c;对农业领域的数据进行收集、整理、分析和展示的平台。它可以帮助农业从业者更好地理解和利用农业数据&#xff0c;提高农业生产效率和决策水平。 农业大数据可视化平台通常具有以下特点和功能&#xff1a; 数据…

WorkTool企微机器人自动接收图片回传(方案三)

自动接收图片并上传到服务器&#xff0c;仅适用企业微信应用 前言 WorkTool企微机器人可以接收客户群的消息&#xff0c;但接收图片一直是个问题&#xff0c;前面也介绍过两种图片接收方案&#xff0c;但都会影响运行效率&#xff0c;并且不能达到100%的图片接收率&#xff0…

配置两台数据库为主从数据库模式

一、主库配置 1、修改配置文件 /etc/my3306.cnf #mysql服务ID&#xff0c;保证整个集群环境中唯一&#xff0c;默认为1server-id1#是否只读&#xff0c;1代表只读&#xff0c;0代表读写read-only0#忽略的数据&#xff0c;指不需要同步的数据库#binlog-ignore-dbmysql#指定同步…