传送门

解析

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;
}

dfs剪枝:洛谷P2809 hzwer爱折纸相关推荐

  1. P1506 拯救oibh总部(dfs,洛谷,java)

    洛谷链接:https://www.luogu.com.cn/problem/P1506 import java.util.Scanner; public class Main {static int ...

  2. (伟大的dfs)洛谷P4961 小埋与扫雷

    小埋总是在家中打游戏,一天,她突然想玩Windows自带的扫雷,在一旁的哥哥看见了,想起了自己小时候信息课在机房玩扫雷的日子,便兴致勃勃地开始教小埋扫雷.然而,小埋还是不明白 \mathrm{3bv} ...

  3. DFS + BFS + 洛谷题

    DFS 经典的迷宫问题( 回溯 问题 ) 在起点处有四个方向,上下左右, 走到终点之后,要再返回,看有没有其他更短的路径. 回溯过程,退回之后,要标记该点的值为没有访问过. 直到找到最短的路径. 左右 ...

  4. 【DFS】洛谷P6566 [NOI Online #3 入门组]观星(民间数据)

    Link Problem Sample-1 in 5 7 *...... ..**..* .*...*. ...*... ....*.. Sample-1 out 3 4 Sample-2 in 10 ...

  5. 【DFS】洛谷P1706:全排列问题(C++)

    题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入格式 n(1≤n≤9) 输出格式 由1-n组成的所有不重复的数字序列,每行一个序列.每个 ...

  6. 折纸机器人的步骤图解_折纸图解飞机

    折纸王子帮你找折纸图解 你好,我是折纸王子,欢迎来到我的公众号. 折纸王子教你折纸,讲解详细,演示清楚,容易听懂,一学就会. 往期精彩: 圣诞节剪纸折纸大全43款 万圣节折纸大全专辑 29款 折纸张口 ...

  7. 折纸机器人的步骤图解_折纸图解老虎

    折纸王子帮你找折纸图解 你好,我是折纸王子,欢迎来到我的公众号. 折纸王子教你折纸,讲解详细,演示清楚,容易听懂,一学就会. 往期精彩: 圣诞节剪纸折纸大全43款 万圣节折纸大全专辑 29款 折纸张口 ...

  8. 折纸机器人的步骤图解_折纸图解走路的人

    折纸王子帮你找折纸图解 你好,我是折纸王子,欢迎来到我的公众号. 折纸王子教你折纸,讲解详细,演示清楚,容易听懂,一学就会. 往期精彩: 圣诞节剪纸折纸大全43款 万圣节折纸大全专辑 29款 折纸张口 ...

  9. 折纸 瓦力机器人_折纸图解金鱼筷子架

    折纸王子帮你找折纸图解 你好,我是折纸王子,欢迎来到我的公众号. 折纸王子教你折纸,讲解详细,演示清楚,容易听懂,一学就会. 往期精彩: 圣诞节剪纸折纸大全43款 万圣节折纸大全专辑 29款 折纸张口 ...

最新文章

  1. js 包含某个字符串_[译] 5 大 JavaScript 字符串操作库
  2. android布局DSL,android – 使用自定义Anko布局DSL解除警报对话框
  3. Java源文件声明规则
  4. softmax函数与交叉熵损失函数
  5. 光敏电阻控制led亮度程序_单片机开发系统学习LED亮度控制原理
  6. Java文件编码格式转换
  7. 【java笔记】类与对象(定义,创建,使用,标准的类,对象数组)
  8. Web Service(二):cxf 实现
  9. Unity与安卓开发的一些路径知识
  10. plsql11破解注册码
  11. Base64的编码原理
  12. 八字 十二长生 详解
  13. Ruff 将助力广东金融高新区“区块链+”金融科技创新与应用落地
  14. 如何解决:微云下载文件总是下载失败
  15. Android ADB常用指令
  16. 电脑PHP动画制作画板,涂鸦板简单实现 Html5编写属于自己的画画板
  17. TP_link家庭无线路由
  18. 定义方法,实现两个整数的加法
  19. React / Vue 前后端分离项目实现微信分享教程
  20. 答:本科生写论文对考研有用吗?

热门文章

  1. mysql 堆叠查询_SQL 注入方法 - 盲注、报错注入、UNION查询注入与堆叠注入
  2. http服务器异步响应,python – 具有异步响应的Twisted http服务器,其中请求必须等待数据变为可用或超时...
  3. php获取某地的ip,php获取本土实际IP
  4. leetcode968. 监控二叉树
  5. [JavaWeb-HTML]HTML文本标签
  6. [Java基础]线程同步之卖票案列分析
  7. Java语法基础50题训练(上)
  8. 蓝桥杯2016初赛-网友年龄-枚举
  9. SQL15 查看学校名称中含北京的用户(通配符使用)
  10. linux查找应用主机,Linux 主机和服务器基本性能检查命令和工具