“机械动力机器数值分析”的版本间的差异
[未复核版本] | [已复核版本] |
(→分析) |
(→人话) |
||
(未显示2个用户的12个中间版本) | |||
第1行: | 第1行: | ||
冬季救援整合包里面的应力相对来说获取困难。为了极致地利用应力以及做好机器匹配,我查阅了相关代码并对其进行了分析。由于本人代码水平也不是很好,也没有编写java的经验,难免有解读错误的地方,望大佬继续补充。 | 冬季救援整合包里面的应力相对来说获取困难。为了极致地利用应力以及做好机器匹配,我查阅了相关代码并对其进行了分析。由于本人代码水平也不是很好,也没有编写java的经验,难免有解读错误的地方,望大佬继续补充。 | ||
=== 粉碎轮 === | == 开始 == | ||
=== 1 基础 === | |||
1秒是20gametick(20t) | |||
=== 2 粉碎轮 === | |||
==== 分析 ==== | ==== 分析 ==== | ||
第16行: | 第21行: | ||
inventory.remainingTime -= processingSpeed; | inventory.remainingTime -= processingSpeed; | ||
其中crushingspeed就是我们给的'''转速/12.5''',这个速度取速度慢的轮,所以我们统一按两轮等速讨论 | |||
每次处理所需要的总进度如果配方有写就按配方,没有就是100(一般都是100) | |||
首先看条件,假如已经吸入了物品(即不是掉落物形态),除数为log2(物品数量),否则按1 | 首先看条件,假如已经吸入了物品(即不是掉落物形态),除数为log2(物品数量),否则按1 | ||
第31行: | 第36行: | ||
我们先假设clamp函数不起作用,不难列出如下公式 | 我们先假设clamp函数不起作用,不难列出如下公式 | ||
[[文件:FGS01.png|无|缩略图]] | [[文件:FGS01.png|无|缩略图|PS:其实是y>e才单调减,但我懒]] | ||
其中a,b,T=100为问题一开始就确立的定值,可操作变量为x,y | 其中a,b,T=100为问题一开始就确立的定值,可操作变量为x,y | ||
第41行: | 第46行: | ||
[[文件:Gs01.png|无|缩略图]] | [[文件:Gs01.png|无|缩略图]] | ||
另v分别等于0.25与20,我们可以得出,上方公式的适用范围 | 另v分别等于0.25与20,我们可以得出,上方公式的适用范围 | ||
[[文件: | [[文件:01FF.png|无|缩略图]] | ||
高于红线则降速到红线,低于蓝线则加速到蓝线 | |||
==== 人话 ==== | ==== 人话 ==== | ||
第49行: | 第54行: | ||
直接用智能溜槽喂64是最佳选择 | 直接用智能溜槽喂64是最佳选择 | ||
粉碎轮转速调成1即可 | |||
单位时间产量与转速成正比,1速64堆叠下粉碎轮每秒可处理3.2个物品 | |||
=== 3 辊压机 === | |||
==== 分析 ==== | |||
public static final int CYCLE = 240; | |||
prevRunningTicks = runningTicks; | |||
runningTicks += (int) Mth.lerp(Mth.clamp(Math.abs(speed) / 512f, 0, 1), 1, 60); | |||
if (prevRunningTicks < CYCLE / 2 && runningTicks >= CYCLE / 2) | |||
runningTicks = CYCLE / 2; | |||
if(runningTicks > CYCLE) | |||
完成() | |||
这里的speed就直接是转速了 | |||
lerp函数作用是将0-1小数等比放大到一定范围内 | |||
由于cycle很小,mc又按t计算,因此处理速度是阶跃的 | |||
观察易得其为两个120的阶跃进度,因此处理速度需要为120的因数才最好,用excel可轻松求出阶跃转速 | |||
==== 人话 ==== | |||
下表转速为最佳转速,自行选取即可 | |||
{| class="wikitable" | |||
|转速 | |||
|增速 | |||
|需时(tick) | |||
|筛选 | |||
|产量(每秒) | |||
|- | |||
|1 | |||
|1 | |||
|240 | |||
|120 | |||
|0.083333333 | |||
|- | |||
|9 | |||
|2 | |||
|120 | |||
|0 | |||
|0.166666667 | |||
|- | |||
|18 | |||
|3 | |||
|80 | |||
|20 | |||
|0.25 | |||
|- | |||
|27 | |||
|4 | |||
|60 | |||
|20 | |||
|0.333333333 | |||
|- | |||
|35 | |||
|5 | |||
|48 | |||
|18 | |||
|0.416666667 | |||
|- | |||
|44 | |||
|6 | |||
|40 | |||
|16 | |||
|0.5 | |||
|- | |||
|53 | |||
|7 | |||
|36 | |||
|16 | |||
|0.555555556 | |||
|- | |||
|61 | |||
|8 | |||
|30 | |||
|12 | |||
|0.666666667 | |||
|- | |||
|70 | |||
|9 | |||
|28 | |||
|13 | |||
|0.714285714 | |||
|- | |||
|79 | |||
|10 | |||
|24 | |||
|10 | |||
|0.833333333 | |||
|- | |||
|87 | |||
|11 | |||
|22 | |||
|10 | |||
|0.909090909 | |||
|- | |||
|96 | |||
|12 | |||
|20 | |||
|9 | |||
|1 | |||
|- | |||
|113 | |||
|14 | |||
|18 | |||
|8 | |||
|1.111111111 | |||
|- | |||
|122 | |||
|15 | |||
|16 | |||
|7 | |||
|1.25 | |||
|- | |||
|148 | |||
|18 | |||
|14 | |||
|6 | |||
|1.428571429 | |||
|- | |||
|165 | |||
|20 | |||
|12 | |||
|5 | |||
|1.666666667 | |||
|- | |||
|200 | |||
|24 | |||
|10 | |||
|4 | |||
|2 | |||
|- | |||
|252 | |||
|30 | |||
|8 | |||
|3 | |||
|2.5 | |||
|} | |||
=== 4 鼓风机 === | |||
==== 分析 ==== | |||
public final ConfigInt fanPushDistance = i(20, 5, "fanPushDistance", Comments.fanPushDistance); | |||
public final ConfigInt fanRotationArgmax = i(256, 64, "fanRotationArgmax", Comments.rpm, Comments.fanRotationArgmax); | |||
float distanceFactor = Math.min(speed / config.fanRotationArgmax.get(), 1); | |||
float pushDistance = Mth.lerp(distanceFactor, 3, config.fanPushDistance.get()); | |||
这上面4是控制距离的,阅读易得距离k=speed/256*17+3 | |||
. | |||
float sneakModifier = entity.isShiftKeyDown() ? 4096f : 512f; | |||
float speed = Math.abs(source.getSpeed()); | |||
float acceleration = (float) (speed / sneakModifier / (entityDistance / maxDistance)); | |||
这3控制吹生物速度,没啥用 | |||
. | |||
public final ConfigInt inWorldProcessingTime = i(150, 0, "inWorldProcessingTime", Comments.inWorldProcessingTime); | |||
int timeModifierForStackSize = ((entity.getItem().getCount() - 1) / 16) + 1; | |||
int processingTime = (int) (AllConfigs.SERVER.kinetics.inWorldProcessingTime.get() * timeModifierForStackSize) + 1; | |||
int value = processing.getInt("Time") - 1; | |||
processing.putInt("Time", value); | |||
这堆是控制处理时间的,一叠物品的总处理时间是... ((数量-1)/16+1)*150... tick | |||
将处理时间乘处理数量即为处理效率,使用excel轻松得 | |||
[[文件:02F.png|无|缩略图]] | |||
可见单堆物品数量越多,处理越快,最快速度为每秒1.73个物品 | |||
==== 人话 ==== | |||
鼓风机速度只影响吹风距离,一速够了 | |||
吹炼的物品堆满64一组,这样最快 | |||
=== 5 搅拌器 === | |||
==== 分析 ==== | |||
if (runningTicks != 20) | |||
runningTicks++; | |||
if ((!level.isClientSide || isVirtual()) && runningTicks == 20) { | |||
上面说明搅拌机从睡觉转换到工作需要预热一秒 | |||
. | |||
float recipeSpeed = 1; | |||
int t = ((ProcessingRecipe<?>) currentRecipe).getProcessingDuration(); | |||
recipeSpeed = t / 100f; | |||
processingTicks = Mth.clamp((Mth.log2((int) (512 / speed))) * Mth.ceil(recipeSpeed * 15) + 1, 1, 512); | |||
processingTicks--; | |||
上面是搅拌机工作代码,每个从头开始处理的配方配方需要log2(int(512/转速))*15 tick 的时间 | |||
由于这里有个int,因此搅拌机也是阶跃的,这时就可以用excel处理了 | |||
==== 人话 ==== | |||
搅拌机最好连续工作,避免暖机问题 | |||
下表为最佳转速,自行选取 | |||
{| class="wikitable" | |||
|转速 | |||
|产量(每秒) | |||
|筛选 | |||
|- | |||
|32 | |||
|0.333333333 | |||
|#VALUE! | |||
|- | |||
|33 | |||
|0.341277366 | |||
|0.007944033 | |||
|- | |||
|35 | |||
|0.35019938 | |||
|0.008922014 | |||
|- | |||
|37 | |||
|0.360317539 | |||
|0.010118159 | |||
|- | |||
|40 | |||
|0.371923928 | |||
|0.011606388 | |||
|- | |||
|43 | |||
|0.385419768 | |||
|0.013495841 | |||
|- | |||
|47 | |||
|0.401373328 | |||
|0.015953559 | |||
|- | |||
|52 | |||
|0.420619836 | |||
|0.019246508 | |||
|- | |||
|57 | |||
|0.444444444 | |||
|0.023824609 | |||
|- | |||
|65 | |||
|0.474942916 | |||
|0.030498472 | |||
|- | |||
|74 | |||
|0.515803743 | |||
|0.040860827 | |||
|- | |||
|86 | |||
|0.574235411 | |||
|0.058431668 | |||
|- | |||
|103 | |||
|0.666666667 | |||
|0.092431256 | |||
|- | |||
|129 | |||
|0.841239671 | |||
|0.174573005 | |||
|- | |||
|171 | |||
|1.333333333 | |||
|0.492093662 | |||
|} | |||
=== 6 动力锯 === | |||
==== 分析 ==== | |||
int time = 50; | |||
time = ((CuttingRecipe) recipe).getProcessingDuration(); | |||
inventory.remainingTime = time * Math.max(1, (inserted.getCount() / 5)); | |||
float processingSpeed = Mth.clamp(Math.abs(getSpeed()) / 24, 1, 128); | |||
inventory.remainingTime -= processingSpeed; | |||
任意单个物品处理时间50,处理速度为 转速/24,转速低于24按24算 | |||
由于时间与处理速度相差小,阶跃影响大,因此使用excel分析阶跃 | |||
{| class="wikitable" | |||
|转速 | |||
|产量 | |||
|应力性价比 | |||
|筛选 | |||
|- | |||
|1 | |||
|0.4 | |||
|40 | |||
|#VALUE! | |||
|- | |||
|25 | |||
|0.416667 | |||
|1.666667 | |||
|0.016667 | |||
|- | |||
|26 | |||
|0.425532 | |||
|1.636661 | |||
|0.008865 | |||
|- | |||
|27 | |||
|0.444444 | |||
|1.646091 | |||
|0.018913 | |||
|- | |||
|28 | |||
|0.465116 | |||
|1.66113 | |||
|0.020672 | |||
|- | |||
|29 | |||
|0.47619 | |||
|1.642036 | |||
|0.011074 | |||
|- | |||
|30 | |||
|0.5 | |||
|1.666667 | |||
|0.02381 | |||
|- | |||
|31 | |||
|0.512821 | |||
|1.65426 | |||
|0.012821 | |||
|- | |||
|32 | |||
|0.526316 | |||
|1.644737 | |||
|0.013495 | |||
|- | |||
|33 | |||
|0.540541 | |||
|1.638002 | |||
|0.014225 | |||
|- | |||
|34 | |||
|0.555556 | |||
|1.633987 | |||
|0.015015 | |||
|- | |||
|35 | |||
|0.571429 | |||
|1.632653 | |||
|0.015873 | |||
|- | |||
|36 | |||
|0.588235 | |||
|1.633987 | |||
|0.016807 | |||
|- | |||
|37 | |||
|0.606061 | |||
|1.638002 | |||
|0.017825 | |||
|- | |||
|38 | |||
|0.625 | |||
|1.644737 | |||
|0.018939 | |||
|- | |||
|39 | |||
|0.645161 | |||
|1.65426 | |||
|0.020161 | |||
|- | |||
|40 | |||
|0.666667 | |||
|1.666667 | |||
|0.021505 | |||
|- | |||
|42 | |||
|0.689655 | |||
|1.642036 | |||
|0.022989 | |||
|- | |||
|43 | |||
|0.714286 | |||
|1.66113 | |||
|0.024631 | |||
|- | |||
|45 | |||
|0.740741 | |||
|1.646091 | |||
|0.026455 | |||
|- | |||
|47 | |||
|0.769231 | |||
|1.636661 | |||
|0.02849 | |||
|- | |||
|48 | |||
|0.8 | |||
|1.666667 | |||
|0.030769 | |||
|- | |||
|50 | |||
|0.833333 | |||
|1.666667 | |||
|0.033333 | |||
|- | |||
|53 | |||
|0.869565 | |||
|1.640689 | |||
|0.036232 | |||
|- | |||
|55 | |||
|0.909091 | |||
|1.652893 | |||
|0.039526 | |||
|- | |||
|58 | |||
|0.952381 | |||
|1.642036 | |||
|0.04329 | |||
|- | |||
|60 | |||
|1 | |||
|1.666667 | |||
|0.047619 | |||
|- | |||
|64 | |||
|1.052632 | |||
|1.644737 | |||
|0.052632 | |||
|- | |||
|67 | |||
|1.111111 | |||
|1.658375 | |||
|0.05848 | |||
|- | |||
|71 | |||
|1.176471 | |||
|1.657001 | |||
|0.065359 | |||
|- | |||
|75 | |||
|1.25 | |||
|1.666667 | |||
|0.073529 | |||
|- | |||
|80 | |||
|1.333333 | |||
|1.666667 | |||
|0.083333 | |||
|- | |||
|86 | |||
|1.428571 | |||
|1.66113 | |||
|0.095238 | |||
|- | |||
|93 | |||
|1.538462 | |||
|1.65426 | |||
|0.10989 | |||
|- | |||
|100 | |||
|1.666667 | |||
|1.666667 | |||
|0.128205 | |||
|- | |||
|110 | |||
|1.818182 | |||
|1.652893 | |||
|0.151515 | |||
|- | |||
|120 | |||
|2 | |||
|1.666667 | |||
|0.181818 | |||
|- | |||
|134 | |||
|2.222222 | |||
|1.658375 | |||
|0.222222 | |||
|- | |||
|150 | |||
|2.5 | |||
|1.666667 | |||
|0.277778 | |||
|- | |||
|172 | |||
|2.857143 | |||
|1.66113 | |||
|0.357143 | |||
|- | |||
|200 | |||
|3.333333 | |||
|1.666667 | |||
|0.47619 | |||
|- | |||
|240 | |||
|4 | |||
|1.666667 | |||
|0.666667 | |||
|} | |||
PS:恕我能力低下,实在看不懂这个max有啥屁用,这不是只能输入一个么,那就只能是1啊,盲猜屎山代码 | |||
==== 人话 ==== | |||
锯子锯东西一速就行 |
2023年1月29日 (日) 15:52的最新版本
冬季救援整合包里面的应力相对来说获取困难。为了极致地利用应力以及做好机器匹配,我查阅了相关代码并对其进行了分析。由于本人代码水平也不是很好,也没有编写java的经验,难免有解读错误的地方,望大佬继续补充。
开始
1 基础
1秒是20gametick(20t)
2 粉碎轮
分析
粉碎轮速度相关的代码为
inventory.remainingTime = recipe.isPresent() ? recipe.get().getProcessingDuration() : 100;
crushingspeed = compound.getFloat("Speed");
float speed = crushingspeed * 4;
float processingSpeed =Mth.clamp((speed) / (!inventory.appliedRecipe ? Mth.log2(inventory.getStackInSlot(0).getCount()) : 1), .25f, 20);
inventory.remainingTime -= processingSpeed;
其中crushingspeed就是我们给的转速/12.5,这个速度取速度慢的轮,所以我们统一按两轮等速讨论
每次处理所需要的总进度如果配方有写就按配方,没有就是100(一般都是100)
首先看条件,假如已经吸入了物品(即不是掉落物形态),除数为log2(物品数量),否则按1
但实际上这个没啥用,因为我们都采用溜槽等方式直接跳过了吸入过程,去除了吸入所需时间,因此我们直接按着已吸入计算即可
clamp的作用是限定范围,高于最大值就等于最大值,小于最小值就等于最小值,这里的上下限是0.25和20
为了方便讨论,我们提出一个问题,假设我要总共处理a个物品,可用应力为定值b,单个机器单次处理y个,转速x,求处理总用时t
已知单个机器(两个粉碎轮)rpm为16,由此可以得可用机器数量k=b/16x
我们先假设clamp函数不起作用,不难列出如下公式
其中a,b,T=100为问题一开始就确立的定值,可操作变量为x,y
易得处理总时在一定的总应力下与转速无关,单个机器单次处理量越大处理总需时越小
在这个结论的基础上我们再讨论clamp函数的影响
易知单个机器处理初始速度为
另v分别等于0.25与20,我们可以得出,上方公式的适用范围
高于红线则降速到红线,低于蓝线则加速到蓝线
人话
在确定总应力下,处理耗时只与单次处理量有关
直接用智能溜槽喂64是最佳选择
粉碎轮转速调成1即可
单位时间产量与转速成正比,1速64堆叠下粉碎轮每秒可处理3.2个物品
3 辊压机
分析
public static final int CYCLE = 240;
prevRunningTicks = runningTicks;
runningTicks += (int) Mth.lerp(Mth.clamp(Math.abs(speed) / 512f, 0, 1), 1, 60);
if (prevRunningTicks < CYCLE / 2 && runningTicks >= CYCLE / 2)
runningTicks = CYCLE / 2;
if(runningTicks > CYCLE)
完成()
这里的speed就直接是转速了
lerp函数作用是将0-1小数等比放大到一定范围内
由于cycle很小,mc又按t计算,因此处理速度是阶跃的
观察易得其为两个120的阶跃进度,因此处理速度需要为120的因数才最好,用excel可轻松求出阶跃转速
人话
下表转速为最佳转速,自行选取即可
转速 | 增速 | 需时(tick) | 筛选 | 产量(每秒) |
1 | 1 | 240 | 120 | 0.083333333 |
9 | 2 | 120 | 0 | 0.166666667 |
18 | 3 | 80 | 20 | 0.25 |
27 | 4 | 60 | 20 | 0.333333333 |
35 | 5 | 48 | 18 | 0.416666667 |
44 | 6 | 40 | 16 | 0.5 |
53 | 7 | 36 | 16 | 0.555555556 |
61 | 8 | 30 | 12 | 0.666666667 |
70 | 9 | 28 | 13 | 0.714285714 |
79 | 10 | 24 | 10 | 0.833333333 |
87 | 11 | 22 | 10 | 0.909090909 |
96 | 12 | 20 | 9 | 1 |
113 | 14 | 18 | 8 | 1.111111111 |
122 | 15 | 16 | 7 | 1.25 |
148 | 18 | 14 | 6 | 1.428571429 |
165 | 20 | 12 | 5 | 1.666666667 |
200 | 24 | 10 | 4 | 2 |
252 | 30 | 8 | 3 | 2.5 |
4 鼓风机
分析
public final ConfigInt fanPushDistance = i(20, 5, "fanPushDistance", Comments.fanPushDistance);
public final ConfigInt fanRotationArgmax = i(256, 64, "fanRotationArgmax", Comments.rpm, Comments.fanRotationArgmax);
float distanceFactor = Math.min(speed / config.fanRotationArgmax.get(), 1);
float pushDistance = Mth.lerp(distanceFactor, 3, config.fanPushDistance.get());
这上面4是控制距离的,阅读易得距离k=speed/256*17+3
.
float sneakModifier = entity.isShiftKeyDown() ? 4096f : 512f;
float speed = Math.abs(source.getSpeed());
float acceleration = (float) (speed / sneakModifier / (entityDistance / maxDistance));
这3控制吹生物速度,没啥用
.
public final ConfigInt inWorldProcessingTime = i(150, 0, "inWorldProcessingTime", Comments.inWorldProcessingTime);
int timeModifierForStackSize = ((entity.getItem().getCount() - 1) / 16) + 1;
int processingTime = (int) (AllConfigs.SERVER.kinetics.inWorldProcessingTime.get() * timeModifierForStackSize) + 1;
int value = processing.getInt("Time") - 1;
processing.putInt("Time", value);
这堆是控制处理时间的,一叠物品的总处理时间是... ((数量-1)/16+1)*150... tick
将处理时间乘处理数量即为处理效率,使用excel轻松得
可见单堆物品数量越多,处理越快,最快速度为每秒1.73个物品
人话
鼓风机速度只影响吹风距离,一速够了
吹炼的物品堆满64一组,这样最快
5 搅拌器
分析
if (runningTicks != 20)
runningTicks++;
if ((!level.isClientSide || isVirtual()) && runningTicks == 20) {
上面说明搅拌机从睡觉转换到工作需要预热一秒
.
float recipeSpeed = 1;
int t = ((ProcessingRecipe<?>) currentRecipe).getProcessingDuration();
recipeSpeed = t / 100f;
processingTicks = Mth.clamp((Mth.log2((int) (512 / speed))) * Mth.ceil(recipeSpeed * 15) + 1, 1, 512);
processingTicks--;
上面是搅拌机工作代码,每个从头开始处理的配方配方需要log2(int(512/转速))*15 tick 的时间
由于这里有个int,因此搅拌机也是阶跃的,这时就可以用excel处理了
人话
搅拌机最好连续工作,避免暖机问题
下表为最佳转速,自行选取
转速 | 产量(每秒) | 筛选 |
32 | 0.333333333 | #VALUE! |
33 | 0.341277366 | 0.007944033 |
35 | 0.35019938 | 0.008922014 |
37 | 0.360317539 | 0.010118159 |
40 | 0.371923928 | 0.011606388 |
43 | 0.385419768 | 0.013495841 |
47 | 0.401373328 | 0.015953559 |
52 | 0.420619836 | 0.019246508 |
57 | 0.444444444 | 0.023824609 |
65 | 0.474942916 | 0.030498472 |
74 | 0.515803743 | 0.040860827 |
86 | 0.574235411 | 0.058431668 |
103 | 0.666666667 | 0.092431256 |
129 | 0.841239671 | 0.174573005 |
171 | 1.333333333 | 0.492093662 |
6 动力锯
分析
int time = 50;
time = ((CuttingRecipe) recipe).getProcessingDuration();
inventory.remainingTime = time * Math.max(1, (inserted.getCount() / 5));
float processingSpeed = Mth.clamp(Math.abs(getSpeed()) / 24, 1, 128);
inventory.remainingTime -= processingSpeed;
任意单个物品处理时间50,处理速度为 转速/24,转速低于24按24算
由于时间与处理速度相差小,阶跃影响大,因此使用excel分析阶跃
转速 | 产量 | 应力性价比 | 筛选 |
1 | 0.4 | 40 | #VALUE! |
25 | 0.416667 | 1.666667 | 0.016667 |
26 | 0.425532 | 1.636661 | 0.008865 |
27 | 0.444444 | 1.646091 | 0.018913 |
28 | 0.465116 | 1.66113 | 0.020672 |
29 | 0.47619 | 1.642036 | 0.011074 |
30 | 0.5 | 1.666667 | 0.02381 |
31 | 0.512821 | 1.65426 | 0.012821 |
32 | 0.526316 | 1.644737 | 0.013495 |
33 | 0.540541 | 1.638002 | 0.014225 |
34 | 0.555556 | 1.633987 | 0.015015 |
35 | 0.571429 | 1.632653 | 0.015873 |
36 | 0.588235 | 1.633987 | 0.016807 |
37 | 0.606061 | 1.638002 | 0.017825 |
38 | 0.625 | 1.644737 | 0.018939 |
39 | 0.645161 | 1.65426 | 0.020161 |
40 | 0.666667 | 1.666667 | 0.021505 |
42 | 0.689655 | 1.642036 | 0.022989 |
43 | 0.714286 | 1.66113 | 0.024631 |
45 | 0.740741 | 1.646091 | 0.026455 |
47 | 0.769231 | 1.636661 | 0.02849 |
48 | 0.8 | 1.666667 | 0.030769 |
50 | 0.833333 | 1.666667 | 0.033333 |
53 | 0.869565 | 1.640689 | 0.036232 |
55 | 0.909091 | 1.652893 | 0.039526 |
58 | 0.952381 | 1.642036 | 0.04329 |
60 | 1 | 1.666667 | 0.047619 |
64 | 1.052632 | 1.644737 | 0.052632 |
67 | 1.111111 | 1.658375 | 0.05848 |
71 | 1.176471 | 1.657001 | 0.065359 |
75 | 1.25 | 1.666667 | 0.073529 |
80 | 1.333333 | 1.666667 | 0.083333 |
86 | 1.428571 | 1.66113 | 0.095238 |
93 | 1.538462 | 1.65426 | 0.10989 |
100 | 1.666667 | 1.666667 | 0.128205 |
110 | 1.818182 | 1.652893 | 0.151515 |
120 | 2 | 1.666667 | 0.181818 |
134 | 2.222222 | 1.658375 | 0.222222 |
150 | 2.5 | 1.666667 | 0.277778 |
172 | 2.857143 | 1.66113 | 0.357143 |
200 | 3.333333 | 1.666667 | 0.47619 |
240 | 4 | 1.666667 | 0.666667 |
PS:恕我能力低下,实在看不懂这个max有啥屁用,这不是只能输入一个么,那就只能是1啊,盲猜屎山代码
人话
锯子锯东西一速就行