有红白蓝三种颜色的小球各 5个,至少取出多少个球可以保证去的两个颜色相同的球?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有红白蓝三种颜色的小球各 5个,至少取出多少个球可以保证去的两个颜色相同的球?相关的知识,希望对你有一定的参考价值。

每个颜色的球5个,至少取出6个球,就可以保证取出的球里有两个相同颜色的球。 参考技术A 这类题型是抽屉原来的最差原则,即考虑所有可能情况中,最不利于某件事情发生的情况。
本题中,按最差原则来讲,假设前3次取出的球颜色都各不相同,那么再去一个球就必然和前3次取出的球其中的一个相同,因此,至少取4个球可以保证取的球颜色相同。

荷兰国旗 Flag of the Kingdom of the Netherlands

问题描述:现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球、白球、蓝球。这个问题之所以叫做荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后正好组成荷兰国旗。

                     

                   

解题方法1:蛮力求解

解题方法2:为了讨论方便用数字0表示红色球,用数字1表示白色球,用数字2表示蓝色球,所以最后的排序就是0...1...2...

快速排序基于划分过程,选取主元间整个数组划分为两个子数组。是否可以借鉴划分过程设定三个指针完成一次遍历完成重新排列,使得所有的球排列成三类不同颜色的球?

(1)设置三个指针: 一个前指针begin,一个中指针current,一个后指针。

current指针遍历整个数组序列

(2)当current指针所指元素为0时,与begin指针所指的元素进行交换(只是交换元素不交换指针位置),然后current++,begin++

(3)当current指针所指元素为1时,不做任何交换(即不移动球),然后current++

(4)当current指针所指元素为2时,与end指针所指的元素进行交换(同样直交换元素不交换指针位置),然后current指针位置不动,end--

参考代码:

#include <bits/stdc++.h>

using namespace std;

void FranceFlag( int *a , int n )
{
    int begin = 0 ;
    int current = 0 ;
    int end = n - 1 ;
    while( current <= end )
    {
        if( a[current] == 0 )
        {
            swap( a[begin] , a[current] );
            begin++;
            current++;
        }
        else if( a[current] == 1 )
        {
            current++;
        }
        else
        {
            swap( a[end], a[current] );
            end--;
        }
    }
    for( int i = 0 ; i < n ; i ++ )
    {
        cout<<a[i]<<" ";
    }
    cout<<endl;
}
int main()
{
    int a[] = {0,1,2,1,1,2,0,2,1,0};
    FranceFlag(a,10);
}

GCC运行结果:

举一反三:

给定一个只有R、G、B三个字符的字符串,请重新排列该字符串中的字符,使得新字符串中的各个字符的排序顺序为:R在前,G在中,B在后。要求空间复杂度为O(1)且只能遍历一次字符串

转载请注明:www.cnblogs.com/zpfbuaa

 

以上是关于有红白蓝三种颜色的小球各 5个,至少取出多少个球可以保证去的两个颜色相同的球?的主要内容,如果未能解决你的问题,请参考以下文章

有红、白、蓝三种颜色的小球各一个,它们除颜色外没有其它任何区别.

一个袋子里有红白蓝三种球各十个,至少拿出多少个才能保证有三个球的颜色是同色?

荷兰国旗-快速排序应用

荷兰国旗 Flag of the Kingdom of the Netherlands

口袋中放有足够多的红、白、蓝色小球,现有22个人轮流从中取球,每人取三个,至少有3个人取出的球的颜色

bzoj2130: 魔塔