首页 > 其他分享 >蓝桥杯2019省A糖果题解

蓝桥杯2019省A糖果题解

时间:2024-09-03 20:55:31浏览次数:12  
标签:状态 int 题解 candy 蓝桥 ## 2019 口味 糖果

 附上链接:[蓝桥杯 2019 省 A] 糖果 - 洛谷,有兴趣的小伙伴可以去试试哦~

# [蓝桥杯 2019 省 A] 糖果

## 题目描述

糖果店的老板一共有 $M$ 种口味的糖果出售。为了方便描述,我们将 $M$ 种口味编号 $1$ ∼ $M$。

小明希望能品尝到所有口味的糖果。遗憾的是老板并不单独出售糖果,而是 $K$ 颗一包整包出售。

幸好糖果包装上注明了其中 $K$ 颗糖果的口味,所以小明可以在买之前就知道每包内的糖果口味。

给定 $N$ 包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖果。

## 输入格式

第一行包含三个整数 $N$、$M$ 和 $K$。

接下来 $N$ 行每行 $K$ 这整数 $T_1,T_2, \cdots ,T_K$,代表一包糖果的口味。

## 输出格式

一个整数表示答案。如果小明无法品尝所有口味,输出 $-1$。

## 样例 #1

### 样例输入 #1

```
6 5 3
1 1 2
1 2 3
1 1 3
2 3 5
5 4 2
5 1 2
```

### 样例输出 #1

```
2
```

题解代码:

 #include <bits/stdc++.h>
using namespace std;
#define N 100010
#define ll long long
int main()
{
    int n, m, k;
    cin >> n >> m >> k;
    vector<int> candy(n);
    vector<int> f(1 << m, N);
    for (int i = 0; i < n; ++i)
    {
        int sum = 0;
        for (int j = 0; j < k; ++j)
        {
            int temp;
            cin >> temp;
            sum = sum | 1 << (temp - 1);
        }
        candy[i] = sum;
    }
    f[0] = 0;
    for (int i = 0; i < 1 << m; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            f[candy[j] | i] = min(f[candy[j] | i], f[i] + 1);
        }
    }
    f[(1 << m) - 1] = f[(1 << m) - 1] == N ? -1 : f[(1 << m) - 1];
    cout << f[(1 << m) - 1];
    return 0;
}

题解的主要思路: 

 本题主要用动态规划+状态压缩去做;假设我们有1-N号的糖果,那么我们可以想象成一个N位二进制串,其中第i位为1表示有i号糖果,为0则表示没有,那么我们可以通过这样一个二进制串来表示状态(即所拥有的糖果状态);

因此对于每包糖果,维护数组candy,将每包糖果进行或操作,得到每包糖果的一个状态;然后创建一个大小为(1<<m)-1的数组f记录某状态所需要的最小糖果包数,然后就可以进行循环求解;

双重循环中外循环是状态,内循环是N包糖果,意思是对于每一种状态,我都拿N包糖果去进行或(也就是我都拿进来一包糖果试试看这个状态会不会更新),由此来更新状态,这里有一点贪心的思想,最后输出f[(1<<m)-1],这个状态转化成二进制是全1,也就是我们最终要求的状态啦!

本题的收获:

本题主要的收获还是学会状态压缩和动态规划,了解如何将目前掌握的糖果的状态压缩成一个数,可以通过二进制去表示这个数,再通过或操作去更新状态,由此进行DP(动态规划) 

 

 

标签:状态,int,题解,candy,蓝桥,##,2019,口味,糖果
From: https://blog.csdn.net/qq_73848829/article/details/141674555

相关文章

  • 8.30 上午 becoder 模拟赛总结 & 题解
    T1密码当时想到解法了,却依然认为自己不会做,我真是个人才。结论:对于$\foralli\in[1,n)$,满足密码不是$a_i$的因数,且密码是$a_k$的因数,设满足条件的最小值为$g$则答案为$\frac{n}{g}$。一种最好想的做法:枚举$\gcd(a_k,n)$的因数作为$g$,并枚举$i\in[1,n)$,判断是......
  • 8.31 上午 becoder 模拟赛总结 & 题解
    T1四个质数的和赛场亲测搜索+小剪枝可以得到70pts。考虑$O(p(V)^2)$枚举任意两个质数的和,其中$p(V)$表示$V$以内质数的个数。然后开个数组记录下对于每种和的记录有多少种情况,查询时for循环扫一遍即可,详见代码。复杂度去掉质数筛$O(p(V)^2+tn)$,代码贴在下面(100pts)......
  • 8.31 下午 梦熊联盟 NOIP 模拟赛总结 & 题解
    T1北极星一个比较好想到的点是从后往前枚举数,计算得出它需要的操作次数,然后给所有前面的数都加上这个操作次数,这样就把每个数独立出来了。所以这道题就变成了如何快速通过这些操作得到一个指定的数。观察大样例的输出,发现每一个数都是11?1?1?的形式,其中问号为+或c,我们可......
  • 9.1 上午 becoder 模拟赛总结 & 题解
    T1货车运输Kruskal重构树模板,没什么好说的,不会的把自己重构了算了,跳过。T2Slagalica可以发现拼图1和2、3拼起来还是拼图1,拼图4和2、3拼起来也还是拼图4,这两种拼图还都不能和自己拼,所以我们可以看作只有拼图1和拼图4来做。对于边界拼图分别是5、7的情况,只有......
  • 8.31 晚上 ABC369 总结 & 题解
    打了一天的比赛。ABCD太水了,直接放代码链接得了,点字母就能看对应代码。E-SightseeingTour看范围$N$只有$400$,所以我们可以先用floyd搞出任意两点间的距离。对于每次询问,发现$K_i$只有$5$,所以可以直接深搜应该走哪座桥,和应该走到哪一端。时间复杂度$O(N3+QK_i......
  • 9.2 上午 becoder 模拟赛总结 & 题解
    T1加法最开始看了好久没想出来,先做T2去了,然后回来想了一会儿发现自己可能智商有点问题。看到求最小值最大,第一反应肯定是二分,那我们怎么应该怎么check呢?考虑顺次枚举序列$A$中的每一个数,然后如果这个数没有达到mid的要求,我们肯定是要添加区间的。那么我们怎么添加区......
  • 9.3 上午 becoder 模拟赛总结 & 题解
    T1能量获取简单的树形DP,设$dp_{i,j}$表示向$i$节点传递了$j$点能量并全部花费完后能激活的封印石的数量。显然有:$ans=\sum\max_{j=0}^{j\leqW_i}{dp_{i,j}}(i\inson_0)$,转移的初始状态为$dp_{i,E_i}=E_i$。设当前枚举到的节点为$x$,子节点为$y$,有经典树上背包转......
  • 算法专项—第十五届蓝桥杯程序设计题解
    前三道属于签到题目;后面才是有难度的!一、读书一本书共n页,小明计划第一天看x页,此后每一天都要比前一天多看y页,请问小明几天可以看完这本书?输入格式一行输入三个整数n,x,y(20≤n≤5000),(1≤x,y≤20),分别表示书的总页数、计划第一天看的页数以及此后每天都要比前一天多看的页数,整......
  • 『主席树』疯狂的颜色序列 题解
    又又又好久没写题解了青花-周传雄三月走过柳絮散落恋人们匆匆我的爱情闻风不动翻阅昨日仍有温度蒙尘的心事恍恍惚惚已经隔世遗憾无法说惊觉心一缩紧紧握着青花信物信守着承诺离别总在失意中度过记忆油膏反复涂抹无法愈合的伤口你的回头划伤了沉默那夜重......
  • SP1843 LEONARDO - Leonardo Notebook 题解
    题目传送锚点博客园食用更佳前置知识1前置知识2首先是判断有无解。先疯狂寻找完所有的环,然后判断是否是偶环,最后如果都是偶环,且偶环的路径数成双成对地出现,或全是奇环,就输出Yes,不然就直接pass掉,输出No。然后我们发现:这里竟然出现了置换群!!!为什么它是置换群呢?我们从群的定......