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。
题目:
要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
【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。
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#数据结构与算法揭秘二
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#常见算法面试题小结
- JavaScript 组件之旅(二)编码实现和算法
- JavaScript数据结构和算法之图和图算法