根据上排的数填写下排的数,并满足要求
来源:互联网 发布:教跳舞的软件 编辑:程序博客网 时间:2024/04/29 20:50
问题:
根据上排给出十个数,在其下排填出对应的十个数, 要求下排每个数都是上排对应位置的数在下排出现的次数。
上排的数:0,1,2,3,4,5,6,7,8,9
解答:ZZ
分析:这应该是一道智力题,下面是来自http://blog.csdn.net/wcyoot/article/details/6428305的思路分析,感觉不错,可以参考下:
解题思路:关键是理解“要求下排每个数都是先前上排那十个数在下排出现的次数”。
做以下分析:设总共有n个数,上排a[0...n-1],下排b[0...n-1]:
1)下排n个数的累加和为n,即b[0]+b[1]+...+b[n-1] = n
2)ai*bi的累加和也为n,即a[0]*b[0]+a[1]*b[1]+...+a[n-1]*b[n-1] = n
3)对于b中任意一个元素b[j], 都存在i,a[i] = b[j].
4)对于b中任意一个元素b[j],都有b[j] >= 0
5)如果a中存在负数。其在b中出现的次数一定为0. 如果a中数值大于n,则其出现次数也为0.
6)a中至少有两个非0数值在b中出现的次数非0
a:由1)n > n*b[i],其中b[i]为最小值,则a b中一定均有数值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)和6)对任意a[i],a[i]*b[i] < n,即b[i] < n/a[i],对所有a[i]>=n/2的元素中,在b中出现的次数必须最多只有1个出现次数不为0,且为1.其余出现次数均为0,即[1, n/2)范围内最多只有n/2-1个元素,故0出现的次数必不小于n/2, [n/2,n)范围内的元素必有一个出现次数为1。因此a数列中也必须有1,否则无解。
d:有c得在数值范围为(0,n/2)中(假设有x这样的数)出现的次数和s为n - b[0]或n-b[0]-1。其中1出现的次数至少为1(由c得)。又如果1出现的次数为1,则1出现的次数已经为2,故1出现的次数必大于1.设为x,则x出现的次数至少为1,而x>1,如果x出现的次数大于1,那么必须要有其他数出现的次数为x,这样无法收敛。故x出现的次数只能为1,1出现的次数只能为2.
另外:(感谢coolria提出)如果上排数列中无0,则下排数列全是0,是其唯一解。
结论:
1)如果上排数列中有0,此时如果上排数列中无0,1,2,n-4这四个数,则下排数列无解;否则下排数列中0出现的次数为n-4;1出现的次数为2;2出现的次数为1;n-4出现的次数为1;其余为0。
2)如果上排数列中无0,则下排数列全0,是其唯一解。
简单代码:
void Print(const int* X, int N)
{
for(int i=0; i<N; ++i)
cout<<X[i]<<' ';
cout<<endl;
}
void TopBottom()
{
const int LEN = 10;
int Top[LEN],Bottom[LEN];
for(int i=0; i<LEN; ++i)
{
Top[i] = i;
Bottom[i] = 0;
}
bool Success = false;
while(!Success)
{
bool ok = true;
for(int i=0; i<LEN; ++i) //对所有的Button【i】调整一圈
{
int Count = 0;
for(int j=0; j<LEN; ++j)//统计B数组中Top[i]的数目
if(Bottom[j] == Top[i]) ++Count;
if(Bottom[i] != Count)//没有达到稳定状态
{
ok = false;
Bottom[i] = Count;
}
}
Print(Bottom, LEN);
Success = ok;
}
cout<<"\nAnswer : \n";
Print(Bottom, LEN);
}
结果:
很快(6次)就收敛懂最终的结果。
- 根据上排的数填写下排的数,并满足要求
- 根据上排给出十个数,在其下排填出对应的十个数,要求下排每个数都是先前上排那十个数在下排出现的次数.
- 根据上排给出十个数,在其下排填出对应的十个数 ,要求下排每个数都是先前上排那十个数在下排出现的次数。
- 根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数
- 给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数
- 面试题--”根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数“C语言实现
- 给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数。
- <仅是自己做笔记。。。系列-5>给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数,要求下排每个数都是先前上排那十个数在下排出现的次数。
- 递推: 给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数
- 根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数
- 算法习题7:下排每个数都是先前上排那十个数在下排出现的次数
- 第六题(下排每个数都是先前上排那十个数在下排出现的次数)
- 根据上排给出十个数,在其下排填出对应的十个数
- 算法题24 根据上排给出十个数,在其下排填出对应的十个数
- 根据上排给出十个数,在其下排填出对应的十个数
- 根据上排给出十个数,在其下排填出对应的十个数
- 根据上排给出十个数,在其下排填出对应的十个数
- 根据上排给出十个数,在其下排填出对应的十个数
- sizeof作用在struct和union上的情况,经典解答
- com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:的解决
- 史上最著名的10个思想实验
- sha1哈希算法 分组过程以及算法路程详细
- Java浅复制和深复制
- 根据上排的数填写下排的数,并满足要求
- C# 中文转拼音方法
- 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
- Java常量池及相关介绍
- screen 常用命令
- C++预编译
- android 开发之旅, should use @string resource警告
- linux在图形环境下启动字符界面
- VS2010 连接MySQL