半年过去了还有人说64马8跑道最少10次分前四,写个9次的部分代码给你们看看

本人菜鸟萌新,写给这些菜鸟萌新不如的人看看,最少只要9次的部分代码(后面懒的写),如有写的不好的地方欢迎留言指导。
主要思路是用每次前四的进入下一轮,设置一个Index选取第一轮排第四的第四马和其他没比的七匹马比,将第一次前三加入win数组。分情况:
1.Index排前四
将排Index前面的马加入win数组,index继续参与比赛
2.Index排后四
将该轮第四马替换Index值,将排Index前面的马加入win数组,用替换后的Index参与比赛。
第一次大比结束共需9轮
在Index为64马中排第四的马即可得出最快轮次为9
后面没写的代码可用win数组查阅horse数组中的马参与比赛,进入第二轮大比
using System;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
double[] horse = { };
int[] win = { };
int Index = -1;
int big = 0;
int count = 0;
int turn = 1;
Random speed = new Random(100);
for (int i = 0; i < 64; i++)
{
double t = speed.NextDouble();
for (int j = 0; j <= i; j++)
{
if (horse[j] ==t)
{
t = speed.NextDouble();
j = 0;
}
}
horse[i] = t;//给马儿写入速度,消除一个速度相同的bug
}
for (int i = 0; i < 8; i++)
{
for (int j = 0; j <= i; j++)
{
if (horse[i] < horse[j])
{
big++;
}
}
if (big == 3)
{
Index = i;
}
big = 0;//找到排第四的马
if (Index != -1)
{
for (int k = 0; k <= i; k++)
{
if (Index < horse[k])
{
count++;
win[count] = k;
}
}
}//收集有效数据,收录前面的马
}
for (turn = 2; turn < 10; turn++)
{
for (int i = turn*7-5; i < turn * 7 +2;i++)
{
if (Index< horse[i])
{
big++;
if (big == 4)
{
big = 0;
Index = -1;
break;//参考标准低于第四的情况立刻跳出循环
}
}
if (big < 4)
{
for (int k = 0; k <= i; k++)
{
if (Index < horse[k])
{
count++;
win[count] = k;//录入
}
}
big = 0;
}
for (int j = 0; j <= i; j++)
{
if (horse[i] < horse[j])
{
big++;
}
}
if (big == 3)
{
Index = i;
}
for (int k = 0; k <= i; k++)
{
if (Index < horse[k])
{
count++;
win[count] = k;//再次录入
}
}
big = 0;
}
}
//第一次大比结束,已知数组win[]和其个数可用同样方法向下求解,不一一写出,在该算法下最少轮次为9
}
}
}
当然该算法可以进一步优化,我们注意到在第一次大比的极端情况下win数组里的数据最多为27个,以相似的选取方式,最糟糕情况下需要15轮。那么在第一次大比优化的前提下选取第一轮排第2或第3马为Index,就可以分出两组可能包含有效数据的数组,有效减少最多轮数,在3马为Index的极端情况下win数组最少有2个数据与此同时产生另一个数组(包含所有排Index后一名的马)有9个数据。在该情况下,需要11次即可获得排前四的马。在win数组数据最多(18)的情况下需要12轮完成。
选取第2马为Index的结论和这个相似暂不讨论,留给读者思考的空间。
也就是说,在存在多于一般常规方法的次数的时候可以通过多次分解数组来有效缩减最多次数于此同时该在该算法下可能还存在优化的空间并可得出一个相似的规律总结。

发布了1 篇原创文章 · 获赞 0 · 访问量 63

猜你喜欢

转载自blog.csdn.net/qq_41543660/article/details/104363646