dfs剪枝:洛谷P2809 hzwer爱折纸

传送门
在这里插入图片描述

解析

dfs暴力枚举即可
这题的重点是如何剪枝
不难发现,随着不断处理,纸条只会越来越短,且所有数字总加和不变
我一开始想到了2个条件:
1.当前长度比理想纸条小,return;
2.总加和与理想纸条不等,直接输出N
但是这样仍是O(n!)的级别,得到了80分
后来又想到:
反转之后对后一半的与反转前对前一半的折叠是等效的,所以只需要递归一半的长度即可
从而通过本题

代码

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <string>
#include <queue>
#include <string>
#include<map>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a));
using namespace std;
const int N=50;
const int M=1e9;
int n,m,mod;
int a[N],b[N];
int save[N][N],save2[N][N];
int flag;
void memory(int l){for(int i=0;i<=a[0];i++) save[l][i]=a[i];
}
void restore(int l){for(int i=0;i<=save[l][0];i++) a[i]=save[l][i];
}
void fold(int p){memory(a[0]);int x=0,l=a[0];if(p<=a[0]/2){for(int i=save[l][0];i>=p+p+1;i--) a[++x]=save[l][i];for(int i=1;i<=p;i++) a[++x]=save[l][i]+save[l][p+p-i+1];a[0]-=p;}else{for(int i=1;i<=2*p-a[0];i++) a[++x]=save[l][i];for(int i=2*p-save[l][0]+1;i<=p;i++) a[++x]=save[l][i]+save[l][save[l][0]-(i-(2*p-save[l][0]))+1];a[0]-=(a[0]-p);}return;
}
void memory2(int l){for(int i=0;i<=a[0];i++) save2[l][i]=a[i];
}
void restore2(int l){for(int i=0;i<=save2[l][0];i++) a[i]=save2[l][i];
}
void fanzhuan(){memory2(a[0]);for(int i=1;i<=a[0];i++) a[i]=save2[a[0]][save2[a[0]][0]-i+1];	
}
bool judge(){for(int i=0;i<=b[0];i++){if(a[i]!=b[i]) return false;}return true;
}
void print(){for(int i=1;i<=a[0];i++) printf("%d ",a[i]);printf("\n");
}
bool jd(){int pd[N]={},ok[N]={};for(int i=1;i<=a[0];i++) pd[i]=a[i];sort(pd+1,pd+1+a[0]);for(int i=1;i<=b[0];i++) ok[i]=b[i];sort(ok+1,ok+1+b[0]);
//	for(int i=1;i<=b[0];i++){
//		printf("b=%d a=%d\n",ok[i],pd[i]);
//	}for(int i=1;i<=b[0];i++){if(ok[i]<pd[i]) return false;}return true;
}
void dfs(){
//	print();if(flag) return;if(a[0]<b[0]) return;
//	if(!jd()) return;int l=a[0];if(a[0]==b[0]){if(judge()){printf("S\n");flag=1;return;}fanzhuan();if(judge()){printf("S\n");flag=1;}restore2(l);return;}for(int i=1;i<=a[0]/2;i++){fold(i);dfs();if(flag) return;restore(l);}fanzhuan();for(int i=1;i<=a[0]/2;i++){fold(i);dfs();if(flag) return;restore(l);}restore2(l);return;
}
int main(){while(scanf("%d",&n)==1){flag=0;int tot=0;mem(a,0);mem(b,0);for(int i=1;i<=n;i++) mem(save[i],0);for(int i=1;i<=n;i++){scanf("%d",&a[i]);tot+=a[i];}a[0]=n;scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d",&b[i]);tot-=b[i];}b[0]=m;if(m>n||tot!=0){printf("N\n");continue;}dfs();if(!flag) printf("N\n");}return 0;
}

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

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

相关文章

2021牛客暑期多校训练营2 B-Cannon(组合+推式子)

B-Cannon 首先nnn个炮在一行操作一次的方案数为2(n−2)2(n-2)2(n−2):前面两个炮只能向右吃&#xff0c;最后两个跑只能向左吃&#xff0c;而其余的炮既可以向左也可以向右&#xff0c;于是有42(n−4)42(n-4)42(n−4)种 于是操作mmm次的操作排列的方案数为2m(n−2)(n−3)...(…

[译]聊聊C#中的泛型的使用

写在前面今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章&#xff0c;因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译&#xff0c;当然在翻译的过程中发现了一些问题&#xff0c;因此也进行了纠正&#xff0c;当然&#xff0c;原文的地址我放在最…

牛客题霸 [ 最长递增子序列] C++题解/答案

牛客题霸 [ 最长递增子序列] C题解/答案 题目描述 给定数组arr&#xff0c;设长度为n&#xff0c;输出arr的最长递增子序列。&#xff08;如果有多个答案&#xff0c;请输出其中字典序最小的&#xff09; 题意&#xff1a; 直接暴力会超时 应该用二分贪心 题解&#xff1a…

P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】

前言 话说在LojLojLoj下了个数据发现这题的名字叫fgofgofgo 正题 题目链接:https://www.luogu.com.cn/problem/P5405 题目大意 nnn张卡的权值为1/2/31/2/31/2/3的概率权重分别是px,1/2/3p_{x,1/2/3}px,1/2/3​&#xff0c;然后按照权值每次获得一张未获得的卡&#xff0c;然后…

模板:线段树

文章目录引言思想模板建树单点修改 / 查询区间修改/查询总结练习引言 有一类题目:要求在区间上维护信息&#xff0c;比如带修改区间求和问题。考虑到枚举求和肯定会超时&#xff0c;我们可以通过一些数据结构来维护信息&#xff0c;例如线段树。 它功能强大&#xff0c;支持区…

Docker最全教程——从理论到实战(三)

容器是应用走向云端之后必然的发展趋势&#xff0c;因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。本篇教程持续编写了2个星期左右&#xff0c;只是为了大家更好地了解、理解和消化这个技术&#xff0c;能够搭上这波车。你可以关注我们的公众号“magiccode…

2021牛客暑期多校训练营4 H-Convolution(数学)

H-Convolution x⨂yxygcd⁡(x,y)x\bigotimes y\frac{xy}{\gcd(x,y)}x⨂ygcd(x,y)xy​ 下面大佬题解推&#x1f981; Ultraman-Ace题解 #include<bits/stdc.h> using namespace std; using lllong long; template <class Tint> T rd() {T res0;T fg1;char chgetcha…

牛客题霸 [ 排序] C++题解/答案

题目描述 给定一个数组&#xff0c;请你编写一个函数&#xff0c;返回该数组排序后的形式。 题意&#xff1a; 排序的方式有很多 二分呀&#xff0c;桶排呀归并等等 stl里的sort快速排序方便好用 题解&#xff1a; class Solution { public:/*** 代码中的类名、方法名、参…

ARC106E-Medals【hall定理,高维前缀和】

正题 题目链接:https://atcoder.jp/contests/arc106/tasks/arc106_e 题目大意 nnn个员工&#xff0c;第iii个在[1,Ai][1,A_i][1,Ai​]工作&#xff0c;[Ai1,2Ai][A_i1,2\times A_{i}][Ai​1,2Ai​]休息&#xff0c;[2Ai1,3Ai][2\times A_i1,3\times A_i][2Ai​1,3Ai​]工作…以…

高并发、低延迟之C#玩转CPU高速缓存(附示例)

写在前面好久没有写博客了&#xff0c;一直在不断地探索响应式DDD&#xff0c;又get到了很多新知识&#xff0c;解惑了很多老问题&#xff0c;最近读了Martin Fowler大师一篇非常精彩的博客The LMAX Architecture&#xff0c;里面有一个术语Mechanical Sympathy&#xff0c;姑且…

RMQ问题:与众不同(st表的高端应用)

解析 预处理 用pre[i]表示以i结尾的最长完美序列起始点&#xff0c;用last[i]表示数字i最后出现的位置 那么可以得到递推式&#xff1a; pre[i]max(pre[i-1],last[x[i]]1);也就是说这个pre要么是受前一位一样的限制&#xff0c;要么是受自己的限制 用f[i]表示以i结尾的最长完…

codeforces1554 E. You(思维+数学+转化)

E. You 首先我们假设每个节点有个点权&#xff0c;点权是儿子的数量。 一个点可以和他的父亲所要权值1&#xff08;先删去自己&#xff0c;再删去父亲&#xff09;&#xff0c;并且此操作不可逆。于是dfs从叶子节点一次递推即可得出某个kkk是否能作为gcd⁡\gcdgcd。 由于上述…

牛客题霸 [括号生成] C++题解/答案

牛客题霸 [括号生成] C题解/答案 题意&#xff1a; 给出n对括号&#xff0c;请编写一个函数来生成所有的由n对括号组成的合法组合。 例如&#xff0c;给出n3&#xff0c;解集为&#xff1a; “((()))”, “(()())”, “(())()”, “()()()”, “()(())”, 题解&#xff1a; …

P5404-[CTS2019]重复【KMP,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P5404 题目大意 给出一个字符串SSS&#xff0c;然后求有多少个长度为mmm的串TTT满足。无限多个串TTT拼接起来后能找出一个长度和SSS相等的子串字典序比SSS小。 1≤∣S∣,m≤20001\leq |S|,m\leq 20001≤∣S∣,m≤2000 解题思…

Docker最全教程——从理论到实战(四)

容器是应用走向云端之后必然的发展趋势&#xff0c;因此笔者非常乐于和大家分享我们这段时间对容器的理解、心得和实践。本篇教程持续编写了2个星期左右并且一直在完善、补充具体的细节和实践&#xff0c;预计全部完成需要1到2个月的时间。由于编写的过程中极其费时&#xff0c…

模板:高精

想必大家一定都深受高精所害 python党&#xff1a;啥叫高精&#xff1f; 这里送上一种高精板子 写法 转载自巨神wyx的博客 #include <bits/stdc.h> using namespace std;const int maxn 1000;struct bign {int d[maxn], len;void clean() {while (len > 1 &&…

牛客题霸 [最长公共子序列] C++题解/答案

牛客题霸 [最长公共子序列] C题解/答案 题目描述 给定两个字符串str1和str2&#xff0c;输出连个字符串的最长公共子序列。如过最长公共子序列为空&#xff0c;则输出-1。 题解&#xff1a; dp经典问题 代码&#xff1a; class Solution { public:/*** longest common su…

2021牛客暑期多校训练营4 G-Product(组合意义+容斥原理)

G-Product Spy_Savior题解 Ultraman-Ace题解 组合意义容斥原理 转化后题目关键要求有DnkDnkDnk个小球放在nnn个盒子中&#xff0c;每个盒子至少有k个小球的方案数。 题目的等价式子为 ∑∑i1naiDnk[ai≥k]D!∏i1nai!\sum_{\sum_{i1}^na_iDnk[a_i\ge k]}\frac{D!}{\prod_{i1}^…

P6122-[NEERC2016]Mole Tunnels【模拟费用流】

正题 题目链接:https://www.luogu.com.cn/problem/P6122 题目大意 给出nnn个点的一棵满二叉树&#xff0c;每个点有容量cic_ici​&#xff0c;mmm次从pip_ipi​处加一只仓鼠然后求每只仓鼠都到一个点的最短路径长度和。 1≤n≤1051\leq n\leq 10^51≤n≤105 解题思路 模拟费…

牛客题霸 [矩阵查找] C++题解/答案

牛客题霸 [矩阵查找] C题解/答案 题目描述 请写出一个高效的在m*n矩阵中判断目标值是否存在的算法&#xff0c;矩阵具有如下特征&#xff1a; 每一行的数字都从左到右排序 每一行的第一个数字都比上一行最后一个数字大 例如&#xff1a; 对于下面的矩阵&#xff1a; [ [1, 3,…