您的位置:首页 > 其它

To_10_r_100_6---根据上排给出十个数,在其下排填出对应的十个数

2015-06-12 16:23 295 查看
! 根据网络资料以及自己理解方式重新整理

题目:

要求下排每个数都是先前上排那十个数在下排出现的次数。  

上排的十个数如下:  

【0,1,2,3,4,5,6,7,8,9】

例子说明:

            共n个数值

数值: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9   ——  a[0], a[1], ...,a[n-1]

分配: 6, 2, 1, 0, 0, 0, 1, 0, 0, 0   ——  b[0], b[1], ... ,  b[n-1]

其中:

0在下排出现了6次;1在下排出现了2次;2在下排出现了1次;3在下排出现了0次;以此类推......

解题说明:

    此题其实是多元一次方程的分析,与程序设计关系不大,因此不附上C++代码

解题结论:

    1. 当存在a[i]==0时,

               当存在a[t]==1&&a[j]=2&&a[k]=n-4时,分配方式如下:

                       a[i]==0 <==> b[i]=n-4;

                       a[t]==1 <==> b[t]=2;

                       a[j]==2 <==> b[j]=1;

                       a[k]==n-4 <==> b[k]=1;

                       其他元素的分配值为0;

                否则,无分配方式满足要求

    2. 当任意a[i] !=0时,对于任意的b[i]=0。

解题思路:

假设:

1. 设总共有n个数,上排a[0...n-1],下排b[0...n-1]。

推理:

1)当{E(bi)}属于{E(a[i])}时,下排n个数的累加和为n,即b[0]+b[1]+...+b[n-1] = n

      b[0]代表a[0]在数组b中出现的次数,如此类推,b[0]+b[1]+...+b[n-1]代表数组b中数组a元素共出现的总次数,即数组b的所以数,值为n。

2)ai*bi的累加和也为n,即a[0]*b[0]+a[1]*b[1]+...+a[n-1]*b[n-1] =n

      这条公式借助1)的思路,a[0]*b[0]代表a[0]元素在b数组中的总和,所以a[0]*b[0]+a[1]*b[1]+...+a[n-1]*b[n-1]代表a的所有元素在b数组中的和,很明显等同于数组b的元素和,即为n。

3)对于b中任意一个元素b[j], 都存在i,a[i] = b[j].

      因为b[j]代表a[j]元素在数组b的数量,同时b[j]作为数组b中存在的元素,一定存在a[i]==b[j],并用b[i]对b[j]元素出现的次数进行记录。

4)对于b中任意一个元素b[j],都有b[j] >= 0

5)如果a中存在负数。其在b中出现的次数一定为0. 如果a中数值大于n,则其出现次数也为0.

6)a中至少有两个非0数值在b中出现的次数非0

      这个的分析类似于3),感觉有点像a数组与b数组相互耦合。

分析:

a:由推理1)知,n = b[0]+b[1]+...+b[n-1] > n*min(b[i]) , 其中min(b[i])为数组b的最小值,则得到min(b[i])<1。因此数组b中一定存在元素等于0。由推理3)知,数组a中一定存在元素等于0,为了方便分析,假设a[0] = 0,b[0]为a[0]在b中出现次数。

b:由于b中一定存在0,则0的出现次数一定大于0,因此b[0]>0 且b[0] < n,b[1...n-1]中至少一个值为0. 非0元素出现的次数一共是n-b[0].

c:有推理2)可以得到,对任意a[i],满足a[i]*b[i] < n,得到b[i] < n/a[i]。因此,对于所有满足a[i]>=n/2的元素中,它们在b中出现的次数必须最多只有1个(即1个或0个)。又因为在[1, n/2)范围内,最多只有n/2-1个元素。因此,0出现的次数必不小于n/2。再由推理3) 得到[n/2,n)范围内的元素等于“0的出现次数”,所以必有一个对应a数组元素出现次数为1。同时得到,a数列中也必须有1,否则无解。

d:由分析c得到,1出现的次数至少为1。现在我们来分析1出现的次数的取值引起的讨论:

      如果1出现的次数为1,则1出现的次数已经为2(a[i]==1下面的次数1以及a[i]>n/2下面的次数1),故发生矛盾,所以1出现的次数必大于1。

      如果1出现的次数为x,且x>1。此时因为推理3)的相互耦合,存在a[j]==x的次数取值大于等于1。若a[j]的取值次数大于1,则无法收敛,感觉有点像恶性循环。故x出现的次数只能等译1,因此得到,1出现的次数只能为2。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法