编程之美---桶中取黑白球

题目:有一个桶,里面有白球、黑球各100个,人们必须按照以下的规则把球取出来:

1、每次从桶里面拿出来两个球;

2、如果是两个同色的球,就再放入一个黑球;

3、如果是两个异色的球,就再放入一个白球;

问:最后桶里面只剩下一个黑球的概率是多少?

解法一:用黑白球各两个,来模拟,从小到多,化繁为简,进行分析和推断,找出其内在的规律,并归纳总结。推断出:每次减少一个球,每次拿球后,白球数要么不变,要么两个两个的减少。所以最后必然只剩一个黑球。

解法二:把黑球编号0,白球编号1,然后就相当于是异或操作了。把全部球异或后,结果为0,所以最后剩黑球。

时间: 2024-12-18 03:12:00

编程之美---桶中取黑白球的相关文章

桶中取黑白球

题目:

<<编程之美>> -- 队列中取最大值操作的问题

不得不说编程之美是一本好书,虽然很多题目在做acm中的过程中遇到过,不过还是有很多值得思考的地方 这是今天在编程之美上看到的一个问题,对于栈转化成队列的一个思考 平时都太过依赖c++内函数库中的栈和队列,但是对于他们的扩展我们还是应该自己进行手写栈和队列来实现更简单的算法 题目大意: 假设有这样一个拥有3个操作的队列: 1. EnQueue(v) : 将 v 加入队列 2. DeQueue: 使队列中队首元素删除并返回此元素 3.MaxElement: 返回队列中的最大元素 设计一种数据结构和算

编程之美——队列中取最大值操作

为实现O(1)的时间复杂度完成取队列中最大元素,使用maxStackItemIndex记录队列(使用两个栈实现)中最大元素下标,使用数组link2NextMaxItem[]记录数组中次大值的下标,这也就是使用两个栈(先进后出)模拟队列二不是直接使用队列(先进先出)的原因:先进后出可以保证当执行pop操作(pop出最大值)时可以更新maxStackItemIndex=link2NextMaxItem[stackTop]:而队列则不具有这种回溯特性: 代码: 1 #include<iostream>

编程之美---队列中取最大值操作问题

如何快速获取队列中的最大值? 最简单的办法,用一个for循环遍历,复杂度为o(n). 解法二:用大顶堆来实现,复杂度为哦o(1),但是入队和出队复杂度变为o(logN),堆中的每一个元素还得有个指针指向它的后继元素. 解法三:可以使用两个栈来模拟队列,从右边的栈进入元素相当于入队,出队时,只有当左边的栈为空时,才把右边栈的元素全部出栈到左边的栈. 1 class stack 2 { 3 public: 4 stack() 5 { 6 stackTop = -1; 7 maxItemIndex =

编程之美——二进制数中1的个数

解法一:若二进制末尾为1,则除以2余1: int count(int a) { int num=0; while(a) { if(a%2==1) ++num; a=a/2; } return num; } 解法二:使用移位操作相除: int count(int a) { int num=0; while(a) { num+=a&0x01; a>>=1; } return num; } 解法三:以上两种算法复杂度log2(t),t为a的二进制表示位数,若要求复杂度仅与二进制表示中1的个数

编程之美-数组中最长递增子序列(包括输出)

#include <iostream> #define N 8 using namespace std; int main(){ int a[N]={1,-1,2,-3,4,-5,6,-7}; int lis[N]; int result[N];//结果 for(int i=0;i<N;i++) result[i]=0; for(int i=0;i<N;i++) { lis[i]=1; for (int j=0;j<i; j++) { if( a[i]> a[j] &a

编程之美之格格取数

#include<iostream>//??????????С???? ? С???? #include<cmath> using namespace std; int lfh(int n) { return (n*(n+1)/2)*(n*(n+1)/2); } unsigned int js(int n) { unsigned int ms=0; unsigned int sum=0; unsigned int num=0; unsigned int zsum=0; unsign

【编程之美】中的美中不足,谈谈我的理解

拿到书本后,看了一下,里面的题目并不是太难,都是初级算法,或者有些根本就不用到算法. 在二分查找的知识点中,还是比较新颖的,看来我写的二分一直存在bug啊.在看看其他方面的题目,很多题目还是要总结分享一下的, 第三章的题目全部看完了,自己也写了一下程序进行了优化.部分作者的程序没有看~cpp的变量名太长了,又不是写项目啊~自己添加的名字估计自己以后看比较方便,对于读者来说,估计作用并不是太大.不如写成伪算法,这样更好一点啊.对吧~~~~~~ 话说这个完全可以用二进制编程来处理.具体的二进制编程技

编程之美——二叉树中节点间最大距离

关于递归程序: 递归程序结构包括三部分:递归出口.逻辑处理(需要处理的问题).递归调用(衔接). 通过递归调用将问题转化为对子问题的解决,通过回溯完成原问题的解答: 递归与数学归纳法:递归是数学归纳法在计算机程序中的体现.使用递归思想设计程序时,我们设置base case,并假设我们会获得n-1的结果,并实现n的结果.这就好像数学归纳法,我们只关注初始和衔接,而不需要关注具体的每一步. 当问题采用递归算法求解时,代码如下: 1 #include<iostream> 2 #include<