本文主要是介绍AOJ 0033 Ball (枚举),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0033
题意:
有一个形似央视大楼(Orz)的筒,从A口可以放球,放进去的球可通过挡板DE使其掉进B裤管或C裤管里,现有带1-10标号的球按给定顺序从A口放入,问是否有一种控制挡板的策略可以使B裤管和C裤管中的球从下往上标号递增。
输入:
第一行输入数据组数N。接下来N行为N组具体数据,每组数据中有10个整数,代表球的放入顺序。
输出:
对于每组数据,若策略存在,输出YES;若不存在,输出NO
思路:用二进制枚举即可。
完整代码:
/*0ms,1008KB*/#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;
}
这篇关于AOJ 0033 Ball (枚举)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!