本文共 1305 字,大约阅读时间需要 4 分钟。
输入一个树状天平,根据力矩相等原则判断是否平衡。所谓力矩相等,就是W l D l =W r D r ,其中W l 和W r 分别为左右两边砝码的重量,D为距离。
思路: 采用递归(先序)方式输入:每个天平的格式为W l ,D l ,W r ,D r ,当W l 或W r 为0时,表示该“砝码”实际是一个子天平,接下来会描述这个子天平。当W l =W r=0时,会先描述左子天平,然后是右子天平。 样例: 输入: 输出“平衡” 代码:#includeusing namespace std;bool solve(int& w) { int w1, d1, w2, d2; bool b1 = true, b2 = true; cin >> w1 >> d1 >> w2 >> d2;//b1 b2用于判断左子天平和右子天平是否平衡 if (!w1) b1=solve(w1); if (!w2) b2 = solve(w2); w = w1 + w2;//w用于修改子天平的总重量 return b1 && b2 && (w1 * d1 == w2 * d2);}int main(){ int T, W; cin >> T;//天平数量 while (T--) { if (solve(W)) cout << "平衡"; else cout << "不平衡"; }}
有一棵二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从上到下从左到右编号为1, 2, 3,…, 2* D-1。在结点1处放一个小球,它会往下落。每个内结点上都有一个开关,初始全部关闭,当每次有小球落到一个开关上时,状态都会改变。当小球到达一个内结点时,如果该结点上的开关关闭,则往左走,否则往右走,直到走到叶子结点,如图所示。
样例输入: 4 2 3 4 10 1 2 2 8 128样例输出:
12 7 512 3分析:
对于每一个结点k 其左子节点 右子节点的编号分别是2k和2k+1每次落到一个位置开关状态均变化,尤其注意第一个结点每次都会变化
4 2: 一共4层 有两个小球时,第二个小球最后下落的位置 输出12 代码:#define _CRT_SECURE_NO_WARNINGS#include#include using namespace std;const int maxd = 20;//最大深度int m[1 << maxd];//最大结点个数为2的maxd次方-1int main(){ int d, n;//d 深度 n结点总个数 while (scanf("%d%d", &d, &n) == 2) { memset(m, 0,sizeof(m)); int k; for (int i =0;i ((1<
转载地址:http://rvten.baihongyu.com/