糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) Apare_xzc
糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp)
xzc 2019/4/5
试题 I: 糖果
时间限制: 1.0s 内存限制: 256.0MB 本题总分:25分
【问题描述】
糖果店的老板一共有 M 种口味的糖果出售。为了方便描述,我们将 M 种口味编号 1 ∼ M。
小明希望能品尝到所有口味的糖果。遗憾的是老板并不单独出售糖果,而是 K 颗一包整包出售。
幸好糖果包装上注明了其中 K 颗糖果的口味,所以小明可以在买之前就知道每包内的糖果口味。
给定 N 包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖果。
【输入格式】
第一行包含三个整数 N、M 和 K。接下来 N 行,每行 K 个整数 T1, T2, · · · , TK,代表一包糖果的口味。
【输出格式】
一个整数表示答案。如果小明无法品尝所有口味,输出 −1。
【样例输入】
6 5 3
1 1 2
1 2 3
1 1 3
2 3 5
5 4 2
5 1 2
【样例输出】
2
【评测用例规模与约定】
- 对于 30% 的评测用例,1 ≤ N ≤ 20 。
- 对于所有评测样例,1 ≤ N ≤ 100,1 ≤ M ≤ 20,1 ≤ K ≤ 20,1 ≤ Ti ≤ M 。
思路:
- 状态压缩,把每一包糖果看成一个集合,把这个集合用一个整数表示。
- 这个整数的二进制形式的第i位为1表示这包糖果里有第i种糖果
- 最多一共有2^20 = 1048576种状态
- 用已有的状态去更新加上第i包糖果后的状态
- 具体见代码
我的代码:
/*
Author: xzc
2019/4/5
2019第十届蓝桥杯省赛C++A组 I题糖果
前会长Y_Cl亲自帮我对拍的,AC了~
*/
#include <bits/stdc++.h>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
#define Mst(a,b) memset(a,(b),sizeof(a))
using namespace std;
int dp[1<<20]; //二进制状态压缩
int a[105];
int main()
{//freopen("in.txt","r",stdin);int m,n,k;while(scanf("%d%d%d",&n,&m,&k)!=EOF){set<int> v; //记录n包中所有糖果的种类数 memset(dp,0x3f,sizeof(int)*(1<<m)); //初始化 dp[0] = 0;For(i,1,n){int x = 0,y;For(j,1,k){scanf("%d",&y);--y;v.insert(y);x |= (1<<y);}a[i] = x; //x的二进制形式第i位为1代表这个集合中有第i+1种糖果 dp[x] = 1;//这种状态只需要第i包糖果1包就可以达到 }if((int)v.size()<m) //把n包唐都买了也吃不到m中糖果 {printf("-1\n");continue;}int ed = (1<<m)-1; //目标状态 For(i,1,n){For(state,0,ed){if(dp[state]>200) continue; //用已有的状态去更新加上第i包糖果后的状态 int to = a[i]|state;dp[to] = min(dp[to],1+dp[state]);}}printf("%d\n",dp[ed]); }return 0;
}
2019/4/5 12:09 1105
(好饿啊,去吃饭了~)
糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) Apare_xzc相关推荐
- 2019第十届蓝桥杯国赛c++B组真题及题解
幸运地水了个国一,应该是对了3个结果填空,2+0.5+0.5个编程大题. 此次国赛共有十个题: A~E 五个结果填空,F~J 五个编程大题. 目前并未找到标准答案,个人解法可能并不完全正确或最优,不对 ...
- 模拟-第十届蓝桥杯省赛C++A组-外卖店优先级
模拟-第十届蓝桥杯省赛C++A组-外卖店优先级 题目: "饱了么"外卖系统中维护着 N 家外卖店,编号 1∼N. 每家外卖店都有一个优先级,初始时 (0 时刻) 优先级都为 0. ...
- 2019 第十届蓝桥杯省赛C/C++大学B组 试题+题解
第十届蓝桥杯省赛C/C++大学B组 试题+题解 第十届蓝桥杯大赛软件类省赛 C/C++ 大学 B 组 考生须知 考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试 题. 考试时间为 4 ...
- 2019第十届蓝桥杯省赛总结
第十届蓝桥杯是在郑州的河南农大龙子湖校区举办的,这是我第一次参加蓝桥杯比赛,前一天晚上在酒店住的,因为自己也不知道自己成绩能如何,所以也就一直睡不着:第二天早上九点开始比赛的,比赛时长为4个小时,下午 ...
- 魔术表演-第14届蓝桥杯省赛Scratch中级组真题第1题
[导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第136讲. 魔术表演,本题是2023年5月7日举行的 ...
- 神奇哈哈镜-第14届蓝桥杯省赛Scratch初级组真题第3题
[导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第132讲. 神奇哈哈镜,本题是2023年5月7日举行 ...
- 九宫格游戏-第14届蓝桥杯省赛Scratch初级组真题第5题
[导读]:超平老师的<Scratch蓝桥杯真题解析100讲>已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第134讲. 九宫格游戏,本题是2023年5月7日举行 ...
- 2019第十届蓝桥杯比赛总结(B组c/c++)
试题 A: 组队 本题总分:5 分 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容. 每位球员担任 1 号位至 5 号位时的评分如下表所示.请你计算首发阵 ...
- 2019第十届蓝桥杯省赛C/C++B组题解
作为很久很久没有写过算法题的考研狗 OvO(是这样的,卑微考研),我于今年再次参加了蓝桥杯... 大家都说这次蓝桥杯简单,我也是这么觉得的(或者说是我运气好),或者说是考细节吧(虽然我也没怎么考虑细节 ...
最新文章
- 栈与队列9——最大值减去最小值小于或等于num的子数组的数量
- 2019热门JAVA面试问题
- 云计算技术都要学什么?教你分清公有云、私有云和混合云
- NSArray、NSDictionary、NSString存储、删改、遍历
- ai推理_人工智能推理能力问答
- BZOJ 1878: [SDOI2009]HH的项链( BIT )
- 基于JAVA+Servlet+JSP+MYSQL的航空订票系统
- 再见2012,你好2013,总结愿望
- .NET 2.0中的企业库异常处理块
- QT安装后编译错误怎么办?
- Stata软件做门槛回归模型(汉森个人主页上的代码)
- JAVA实现126邮箱发送及部署后发送邮箱报错问题
- 倪海厦天纪笔记16_倪海厦-天纪16
- Helm 创建一个NOTES.txt文件
- 编程之法-C语言应用开发与工程实践-C语言概述
- JSP的四大作用域及属性范围
- 北京市专精特新中小企业认定要求及流程,补贴60万
- 盘点几款还不错的企业网盘产品
- 东田纳西州立大学计算机排名,东田纳西州立大学的计算机专业如何?
- HTML5之placeholder属性
热门文章
- 计算机操作知识试题及答案,2016计算机信息技术操作考试题及答案
- 服装进销存管理软件哪个比较好用?
- android自定义UI模板图文详解
- 转载,常用RGB color
- python实现erp自动化_用轻流,实现ERP的自动化工作流程
- android 2.3 刷机,【MIUI DFY】【Android 2.3.4】 刷机教程.doc
- SpringCloud(3)CloudAlibaba Nacos Sentinel Seata
- 不是你需要中台,而是一名合格的架构师(附各中台建设PPT)
- mysql uuid分页优化_MySQL性能优化之分页查询优化
- 2022-2028年全球与中国全轮驱动(AWD)系统行业深度分析