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

输入:

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

输出:

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

解法1:DFS

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

#include<cstdio>
#include<string>
#include<iostream>
#include<cstring>
#include<algorithm>
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<cstdio>
#include<cstring> 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 <iostream>
#include <bitset>
#include <algorithm>
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<bitset<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;
}

最新文章

  1. monodroid 调用 JNI Native 的一些问题
  2. Bubble Sort (5775)
  3. 【Alpha】Daily Scrum Meeting第四次
  4. SharePoint 判断用户是否在字段&quot;人员和组&quot;里面
  5. 三部曲二(基本算法、动态规划、搜索)-1003-Lucky and Good Months by Gregorian Calendar
  6. FB面经prepare: task schedule II
  7. U盘安装Linux CentOS 6.5 64位操作系统(来自互联网)
  8. homework-05 服务器与客户端
  9. iOS 简单理解类的本质
  10. [转] 关于C++中模板中的typename和class的区别比较
  11. icon 图标下载
  12. HFun.快速开发平台(二)=》自定义列表实例(请求参数的处理)
  13. Qt 编程中 namespace Ui { class Widget; } 解析
  14. 简单酷炫的Canvas数字时钟
  15. Linux wc -l 统计文件行数存在的问题
  16. ceph luminous 新功能之内置dashboard 之 mgr功能模块配置
  17. 解决:Windows 强制升级为8.1之后 Mysql连接不上, VisualSVN Server无服务
  18. &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=7&quot; /&gt;意思是将IE8用IE7进行渲染,使网页在IE8下正常
  19. sgu 130Circle dp
  20. Ubuntu 11.10 H3C iNode 客户端安装

热门文章

  1. 移动web页面前端开发总结
  2. nuget包重装
  3. PHP获取接口数据(模拟Get)
  4. display:none显示和隐藏
  5. 2017《时间的朋友》罗振宇跨年演讲ppt
  6. C# 构建动态树
  7. js replaceAll
  8. 元素堆叠问题、z-index、position
  9. 上个项目的一些反思 III
  10. scenejs的一点Cameras小笔记