问题是:
您必须使用一系列交换以升序排列(排列:从1到N的数字以随机顺序排列)。每个掉期都有一个价格,并且有5种价格类型。编写一个程序,以最小的价格对给定的数组进行排序。 价格有两种: priceByValue和priceByIndex 。所有一种价格都以2个二维数组N * N给出。示例如何获取价格: 您要交换排列中的第2个和第5个元素,其值分别为4和7。此交换的价格为priceByValue [4] [7] + priceByIndex [2] [5] 。
为了获得所有价格(排列元素的值从1开始),所有数组的索引都从1(而不是从0)开始计数:priceByIndex [2] [5]实际上是priceByIndex [ 1] [4]的代码。此外,从二维数组访问价格的索引顺序并不重要:priceByIndex [i] [j] = priceByIndex [j] [i]和priceByIndex [i] [i]始终等于0。(priceByValue相同)
价格类型:
价格[i] [j] = 0;
价格[i] [j] = 1到4 * N之间的随机数;
价格[i] [j] = | i-j | * 6;
价格[i] [j] = sqrt(| i-j |)* sqrt(N)* 15/4;
价格[i] [j] = max(i,j)* 3;
当您通过索引访问价格时,i和j是要从原始数组交换的元素的索引;当您按值访问价格时,i和j是要从原始数组交换的元素的值。 (而且它们总是从1开始计数)
提供的信息: N-1到400之间的整数,混合数组,priceByIndex类型,priceByIndex矩阵,priceByValue类型,priceByValue矩阵。 (矩阵的所有元素都来自给定的类型)
应该在屏幕上显示的内容:交换次数,所有交换(仅按索引-2 5表示您交换了第2个和第3个元素)和价格。
当我仍在学习C ++时,我想知道对数组进行排序的最有效方法是什么,以便尝试以最小的成本找到排序。 可能存在一种方法来访问一系列交换,这些交换产生一个排序后的数组,并查看哪个数组的价格最小,我需要通过交换按值和索引均接近的元素来对数组进行排序,但是我不这样做知道该怎么做。如果有人可以给我一个解决方法,让我找到最便宜的代码,我将不胜感激。预先谢谢你!
更多:这个问题可能没有解决办法,我只是想使结果接近理想值。
答案 0 :(得分:1)
动态编程!
将问题视为图表。 N个阶乘置换中的每个置换都代表一个图形顶点,并且允许的交换只是顶点之间的弧线。掉期的价格只是权重。
当您以这种方式查看问题时,可以使用Dijkstra的算法轻松解决,该算法可找到从一个顶点到另一个顶点的图形的最低成本路径。
这也称为“单对最短路径”
答案 1 :(得分:0)
您可以使用一种算法来按字典顺序对数组进行排序并对其进行修改,以使其满足您的需要(您没有提到排序标准,例如期望的结果,即最低值优先……)。有多种算法可用为此,即快速排序,...
https://www.geeksforgeeks.org/lexicographic-permutations-of-string/
中有一个代码示例