蓝桥集训之糖果

蓝桥集训之糖果

  • 核心思想:dfs + 剪枝 + 重复覆盖问题

    • 暴搜 直到所有列都覆盖
    • 优化:
      • 1.迭代加深 答案从1开始++

      • 2.逻辑简化 每次从可选行数最少得一列开始

      • 3.可行性剪枝 添加估值函数h(),表示至少还需要选几行 与剩余行数的大小比较

        • 在这里插入图片描述
      • 4.**位运算 **将每包糖果以二进制数存下 有口味为1 没有口味为0

  •   #include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 110 , M = 1<<20; int n,m,k;//找第几位是1 例如log2[100] = 2,log2[1000] = 3int log2[M];vector<int> col[N];  //放每种口味糖果可以用哪几张图int lowbit(int x){return x & -x;}int h(int state)  //至少还要选几包{int res=0;for(int i=(1<<m)-1-state;i;i-=lowbit(i)){int c = log2[lowbit(i)];res ++;//见优化3for(auto row:col[c])  i &= ~row;}return res;}bool dfs(int depth,int state){if(!depth || h(state) > depth) return state == (1<<m) -1;int t = -1;//从当前图开始遍历 找最少可选行最少的for(int i=(1<<m) -1 - state;i;i-=lowbit(i)){int c = log2[lowbit(i)];if(t == -1 || col[c].size() < col[t].size()) t = c;}//遍历该行for(auto row:col[t]){//或运算 看看行不行if(dfs(depth-1,state|row)) return true;}return false;}int main(){cin>>n>>m>>k; for(int i=0;i<m;i++) log2[1<<i] = i;  //预处理log2for(int i=0;i<n;i++){int state = 0;for(int j=0;j<k;j++){int c;cin>>c;state |= 1<<(c-1);  //把这张图补充到state上  或运算}for(int j=0;j<m;j++)  //遍历每一种口味if(state>>j & 1)  //如果有这种口味col[j].push_back(state);}//去重 每一种口味的方案都要去for (int i = 0; i < m; i ++ ){sort(col[i].begin(), col[i].end());col[i].erase(unique(col[i].begin(), col[i].end()), col[i].end());}int depth = 1;while(depth <= m && dfs(depth,0) == 0)  //从1开始找答案{depth ++;}if(depth>m) depth = -1;cout<<depth<<endl;}
    

    参考题解 :https://www.acwing.com/solution/content/92078/

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

32程序结构学习

初始化代码 void LED_GPIO_Config(void) { /*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启GPIOC的外设时钟*/RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); /*选择要控制的GPIOC引脚*/ GPIO_InitStructur…

软件测试 自动化测试selenium 基础篇

文章目录 1. 什么是自动化测试&#xff1f;1.1 自动化分类 2. 什么是 Selenium &#xff1f;3. 为什么使用 Selenium &#xff1f;4. Selenium 工作原理5. Selenium 环境搭建 1. 什么是自动化测试&#xff1f; 将人工要做的测试工作进行转换&#xff0c;让代码去执行测试工作 …

Redis和Mysql的数据一致性问题

在高并发的场景下&#xff0c;大量的请求直接访问Mysql很容易造成性能问题。所以我们都会用Redis来做数据的缓存&#xff0c;削减对数据库的请求的频率。 但是&#xff0c;Mysql和Redis是两种不同的数据库&#xff0c;如何保证不同数据库之间数据的一致性就非常关键了。 1、导…

深度学习-解读GoogleNet深度学习网络

深度学习-解读GoogleNet深度学习网络 深度学习中&#xff0c;经典网络引领一波又一波的技术革命&#xff0c;从LetNet到当前最火的GPT所用的Transformer&#xff0c;它们把AI技术不断推向高潮。2012年AlexNet大放异彩&#xff0c;它把深度学习技术引领第一个高峰&#xff0c;打…

数据结构的概念大合集01(含数据结构的基本定义,算法及其描述)

概念大合集01 1、数据结构基础的定义2、数据结构2.1 数据元素之间关系的集合2.2数据结构的三要素2.2.1数据的逻辑结构2.2.2数据的存储&#xff08;物理&#xff09;结构2.2.3数据的运算 3、数据类型4、抽象数据类型类型&#xff08;ADT&#xff09;5、算法及其描述5.1算法的5个…

@RequestParam、@PathVariable、@RequestBody

1、中文翻译 RequestParam-请求参数、PathVariable-路径变量、RequestBody请求体 2、作用&#xff1a; Controller中获取前端传递的参数 3、从注解本身角度分析 3.1、PathVariable&#xff1a;路径变量 通过 PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形…

四连杆机构运动学仿真 | 【Matlab源码+理论公式文本】

【程序简介】&#x1f4bb;&#x1f50d; 本程序通过matlab实现了四连杆机构的运动学仿真编程&#xff0c;动态展现了四连杆机构的运动动画&#xff0c;同时给出了角位移、角速度和角加速度的时程曲线&#xff0c;除了程序本身&#xff0c;还提供了机构运动学公式推导文档&…

【Exception系列】SocketTimeoutException

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【Spring Boot】创建你的第一个 Spring Boot 应用

创建你的第一个 Spring Boot 应用 1.环境配置2.步骤详解3.项目结构分析3.1 入口类 DemoApplication3.2 控制器 PathVariableController3.3 控制器 BasicController3.4 模型 User 4.运行 Spring Boot 目前已经成为了 Java 开发领域的框架范式。本篇博客&#xff0c;我将带领大家…

java小型人事管理系统

开发工具&#xff1a; MyEclipseJdkTomcatSQLServer数据库 运行效果视频&#xff1a; https://pan.baidu.com/s/1hshFjiG 定制论文&#xff0c;联系下面的客服人员

软考80-上午题-【面向对象技术3-设计模式】-结构型设计模式03

一、外观模式 1-1、意图 为子系统中的一组接口提供一个一致的界面。 Facade 模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 1-2、结构 Facade 知道哪些子系统类负责处理请求&#xff1a;将客户的请求代理给适当的子系统对象。Subsvstem classes …

2023年中国抗DDoS市场规模现状及竞争格局,公有云抗DDoS是主要增长点

分布式拒绝服务&#xff08;DDoS&#xff09;是在DoS基础之上产生的一种新的攻击方式&#xff0c;具有多对一的攻击模式。它通过制造伪造的流量&#xff0c;使得被攻击的服务器、网络链路或是网络设备&#xff08;如防火墙、路由器等&#xff09;负载过高&#xff0c;无法处理正…