牛客的两道dfs
1.传送门:牛客13594-选择困难症
题意:给你k类物品,每类物品有a[i]个每个物品都有一个value,每类物品最多选一个,要求有多少种选法使得总value>m(没要求每类物品都必须选)
题解:很明显是一道dfs的题,但是要剪枝优化,假设我们当前所有物品的总vaule>m,那么我们只要算这件物品之后的组合总数就行了(特别注意每类物品可以不选,即num[0]=0,dfs每类物品的个数要从位置0开始而不是1),用一个mul数组来记录每类的方案数.
代码:
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6 #include <stack>
7 #include <queue>
8 #include <vector>
9 #include <map>
10 #include <set>
11 #include <unordered_set>
12 #include <unordered_map>
13 #define ll long long
14 #define fi first
15 #define se second
16 #define pb push_back
17 #define me memset
18 const int N = 1e6 + 10;
19 const int mod = 1e9 + 7;
20 using namespace std;
21 typedef pair<int,int> PII;
22 typedef pair<long,long> PLL;
23
24 int k;
25 ll m,ans,a[20][200],mul[20],num[200];
26
27
28 void dfs(int pos,ll sum){
29 if(pos>k) return;
30 for(int i=0;i<=num[pos];++i){
31 if(a[pos][i]+sum>m){
32 ans+=(num[pos]-i+1)*mul[pos+1];
33 return;
34 }
35 dfs(pos+1,sum+a[pos][i]);
36 }
37 }
38
39 int main() {
40 ios::sync_with_stdio(false);
41 while(cin>>k>>m){
42 for(int i=1;i<=k;++i){
43 cin>>num[i];
44 for(int j=1;j<=num[i];++j){
45 cin>>a[i][j];
46 }
47 sort(a[i]+1,a[i]+1+num[i]);
48 }
49 ans=0;
50 mul[k+1]=1;
51 for(int i=k;i>=1;--i) mul[i]=mul[i+1]*(num[i]+1);
52 dfs(1,0);
53 printf("%lld\n",ans);
54 }
55
56 return 0;
57 }
2.传送门:牛客14132-贝伦卡斯泰露
题意:问是否可以将一个数组变成成两个完全相同的数组(元素必须从子序列选)
题解:可以直接暴搜,a[ne]表示的是我当前要添加给a1或a2的值,假如它等于a1,那么就给a2,否则给a1(即a2放不放数永远看a1),假如a1或a2的长度>n/2,就说明这种方案不行,回溯.因为无论如何第一个数一定给a1,所以直接dfs(1,0,2);
代码:
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6 #include <stack>
7 #include <queue>
8 #include <vector>
9 #include <map>
10 #include <set>
11 #include <unordered_set>
12 #include <unordered_map>
13 #define ll long long
14 #define fi first
15 #define se second
16 #define pb push_back
17 #define me memset
18 const int N = 1e6 + 10;
19 const int mod = 1e9 + 7;
20 using namespace std;
21 typedef pair<int,int> PII;
22 typedef pair<long,long> PLL;
23
24 int t;
25 int n,a[N];
26 int a1[N],a2[N];
27
28 bool dfs(int p1,int p2,int ne){
29 if(p1>n/2 || p2>n/2) return false;
30 if(ne==n+1) return true;
31 if(a[ne]==a1[p2+1]){
32 a2[p2+1]=a[ne];
33 if(dfs(p1,p2+1,ne+1)) return true;
34 }
35 a1[p1+1]=a[ne];
36 return dfs(p1+1,p2,ne+1);
37 }
38
39 int main() {
40 ios::sync_with_stdio(false);
41 cin>>t;
42 while(t--){
43 cin>>n;
44 for(int i=1;i<=n;++i) cin>>a[i];
45
46 a1[1]=a[1];
47 if(dfs(1,0,2)) printf("Frederica Bernkastel\n");
48 else printf("Furude Rika\n");
49
50 }
51
52 return 0;
53 }
牛客的两道dfs的更多相关文章
- 牛客小白月赛6C-桃花(DFS/BFS求树的直径)
链接:https://www.nowcoder.com/acm/contest/136/C 来源:牛客网 桃花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言 ...
- 牛客练习赛16 C 任意点【并查集/DFS/建图模型】
链接:https://www.nowcoder.com/acm/contest/84/C 来源:牛客网 题目描述 平面上有若干个点,从每个点出发,你可以往东南西北任意方向走,直到碰到另一个点,然后才可 ...
- 牛客网 牛客练习赛13 B.幸运数字Ⅱ-数组 or DFS
B.幸运数字Ⅱ 链接:https://www.nowcoder.com/acm/contest/70/B来源:牛客网 这个题就是找出来数据范围内的所有的幸运数,然后直接区间累加起来就可以了. ...
- 牛客小白月赛4 C 病菌感染 dfs
链接:https://www.nowcoder.com/acm/contest/134/C来源:牛客网 题目描述 铁子和顺溜上生物课的时候不小心将几滴超级病菌滴到了培养皿上,这可急坏了他们. 培养皿可 ...
- 牛客小白月赛6 C 桃花 dfs 求树上最长直径
链接:https://www.nowcoder.com/acm/contest/136/C来源:牛客网 题目描述 桃花一簇开无主,可爱深红映浅红. ...
- 牛客小白月赛12 H 华华和月月种树 (离线dfs序+线段树)
链接:https://ac.nowcoder.com/acm/contest/392/H 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言2621 ...
- 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)
链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- 牛客练习赛27-----C.水图(DFS求最长路径)
传送门 来源:牛客网题目描述:小w不会离散数学,所以她van的图论游戏是送分的小w有一张n个点n-1条边的无向联通图,每个点编号为1~n,每条边都有一个长度小w现在在点x上她想知道从点x出发经过每个点 ...
- 牛客网-乌龟跑步-(四维dfs)
链接:https://ac.nowcoder.com/acm/problem/15294来源:牛客网 题目描述 有一只乌龟,初始在0的位置向右跑. 这只乌龟会依次接到一串指令,指令T表示向后转,指令F ...
随机推荐
- SQL注入-流程
一般注入分类: 时间,布尔,报错,堆,联合 有关函数介绍: current_user() 当前用户名 session_user() 链接数据库的用户名 @@basedir mysql安装路径 @@da ...
- linux硬盘分区和fdisk命令
分区的几个概念 硬盘分区有三种,主分区.扩展分区.逻辑分区.一个硬盘主分区至少有1个,最多4个,扩展分区可以没有,最多1个.且主分区+扩展分区总共不能超过4个.逻辑分区可以有若干个.在windows下 ...
- 5.1中repair table
mysql> repair table xs;+---------+--------+----------+----------+| Table | Op | Msg_type | Msg_te ...
- Pandas应用案例-股票分析:使用tushare包获取股票的历史行情数据进行数据分析
目标: 使用tushare包获取股票的历史行情数据 输出该股票所有收盘比开盘上涨3%以上的日期 输出该股票所有开盘比前日收盘跌幅超过2%以上的日期 假如为我们从2010年1月1日开始,每月第一个交易日 ...
- 你这样用过DO循环吗?
DATA: BEGIN OF text, word1(4) TYPE c VALUE 'This', word2(4) TYPE c VALUE 'is', ...
- pycharm工具的使用
一.Pycharm常用快捷键 快捷键 作用 备注 ctrl + win + 空格 自动提示并导包 连按两次 ctrl + alt + 空格 自动提示并导包 连按两次 Alt + Ente ...
- luogu P4116 Qtree3
题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...
- STM32驱动LCD原理
TFTLCD即薄膜晶体管液晶显示器.它与无源TN-LCD.STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性 ...
- MYSQL基础知识的复习3
聚合函数 max():求最大值 例:求最高工资 select max(sal) from emp; min():求最小值 例:求最小工资 select min(sal) from emp; avg() ...
- linux设备
设备初始化时同样要执行一个device_register函数,该函数传入一个struct device *类型的指针,因此要定义一个struct device类型的变量作为我们的设备. struct ...