博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AOJ 0033 Ball【DFS】
阅读量:4948 次
发布时间:2019-06-11

本文共 2589 字,大约阅读时间需要 8 分钟。

有一个筒,从A口可以放球,放进去的球可通过挡板DE使其掉进B管或C管里,现有带1-10标号的球按给定顺序从A口放入,问是否有一种控制挡板的策略可以使B管和C管中的球从下往上标号递增。

输入:

第一行输入数据组数N。接下来N行为N组具体数据,每组数据中有10个整数,代表球的放入顺序。

输出:

对于每组数据,若策略存在,输出YES;若不存在,输出NO

解法1:DFS

思路:每次判断当前小球是否大于左边容器的最上端的小球,如果可以就放,否则再去看右边的。一旦发现左右两边都不能放,那就只能判定是NO了。

#include
#include
#include
#include
#include
using namespace std;typedef long long LL;const int INF = 0x7FFFFFFF;const int maxn = 1e5 + 10; int a[11],vis[11],flag;void dfs(int x,int l,int r){ int i; if(x==11)return; if(flag)return; if(a[x]>l)dfs(x+1,a[x],r); else if(a[x]>r)dfs(x+1,l,a[x]); else{flag=1;return;}}int main(){ int T,i,j,k; scanf("%d",&T); while(T--) { flag=0; for(i=1;i<=10;i++) scanf("%d",&a[i]); memset(vis,0,sizeof(vis)); dfs(1,0,0); if(flag)printf("NO\n"); else printf("YES\n"); } return 0;}

解法2:二进制枚举

思路:看作0,1序列

#include
#include
int a[15], l[15], r[15], t, i, j, lc, rc, cnt;bool vis[15], flag;bool solve(){ for (i = 0; i < 1024; ++i) { memset(l, 0, sizeof(l)); memset(r, 0, sizeof(r)); lc = rc = 0; for (cnt = 0, j = i; cnt < 10; ++cnt, j >>= 1) { if (j & 1) l[lc++] = a[cnt]; else r[rc++] = a[cnt]; } flag = true; for (j = 1; j < lc; ++j) if (l[j] < l[j - 1]) { flag = false; break; } if (flag) for (j = 1; j < rc; ++j) if (r[j - 1] > r[j]) { flag = false; break; } if (flag) return true; } return false;}int main(){ scanf("%d", &t); while (t--) { memset(vis, 0, sizeof(vis)); for (i = 0; i < 10; ++i) scanf("%d", &a[i]); puts(solve() ? "YES" : "NO"); } return 0;}

bitset增强版

#include 
#include
#include
using namespace std; int main(){ int n; cin >> n; while (n--) { int ball[10]; for (int i = 0; i < 10; ++i) { cin >> ball[i]; } bitset<10> direction; int all = 1024; while (all-- > 0) { direction = static_cast
<10> >(all); bool perfect = true; int left = 0; int right = 0; for (int i = 0; i < 10; ++i) { if (direction[i]) { if (ball[i] > left) { left = ball[i]; } else { perfect = false; break; } } else { if (ball[i] > right) { right = ball[i]; } else { perfect = false; break; } } } if (perfect) { break; } } if (all >= 0) { cout << "YES" << endl; } else { cout << "NO" << endl; } } return 0;}

转载于:https://www.cnblogs.com/demian/p/6150564.html

你可能感兴趣的文章
android 注释常用标签
查看>>
Spring context:property-placeholder 一些坑
查看>>
如何使用 adb 命令实现自动化测试
查看>>
中国剩余定理
查看>>
JS中this的详解及例子
查看>>
用Entity Framework 来创建MySql数据库和表结构
查看>>
TensorFlow随机值:tf.random_normal函数
查看>>
poj 1733 Parity game(种类并查集)
查看>>
SQL Server2008函数
查看>>
课堂随笔3月8日下午
查看>>
ORM之F查询和Q查询
查看>>
BIOS编程相关常用外设介绍
查看>>
springboot学习笔记:9.springboot+mybatis+通用mapper+多数据源
查看>>
NO 3 ,人生苦短,我学python之python 元祖tuple魔法
查看>>
Spring-Boot Banner
查看>>
876-链表的中间结点
查看>>
BZOJ 3781 莫队
查看>>
BZOJ 3674/BZOJ 3673 主席树
查看>>
JAVA的String类
查看>>
wtforms 简单使用
查看>>