丧杰1927 2024-07-10 18:31 采纳率: 25%
浏览 3

插入排序(insert)

3. 插入排序 (insert)
【题目描述】
有依次排列的一列数a1-an。你可以随便把一个数拿出,插到最前面(当前第1个数a1前)、最后面(当前最后一个数an后面)、或者剩余数列中任意的相邻两个数之间。
比如起始数依次为4 5 6 7 8 9。如果把第4个数a4=7拿出,然后任意放回,可能有
7 4 5 6 8 9
4 7 5 6 8 9
4 5 7 6 8 9
4 5 6 7 8 9
4 5 6 8 7 9
4 5 6 8 9 7
这6种排列。
已知把第i个数ai拿出后插回去花费的代价为该数的值ai。小猪希望花费最少的代价来把这个数列排成不降序列。所谓不降序列,是指对于数列中任意两个数,排在前面的数小于等于排在后面的数。
【输入】
输入文件insert.in的第一行只有一个整数n,表示共有n个整数。
第2行有n个整数(互相之间以一个空格分隔),表示待排序的n个数。
【输出】
输出文件insert.out中只有一行,该行只有一个整数,表示花费的最小代价。
【样例输入】
4
7 1 2 3
【样例输出】
6

【样例说明】
很显然移动7是不划算的。一种移动方法是:
初始情况:7 1 2 3 => (把3移到最前面得) 3 7 1 2
=> (把1移到最前面得) 1 3 7 2
=> (把2移到1与3之间得) 1 2 3 7 最终整个序列成为升序。
消耗的代价是3 + 1 + 2 = 6。
【数据规模】
30%的数据初始数列是1至n的一个排列,即1至n都在初始数列出现且仅出现一次;
20%的数据,1≤n≤10;
90%的数据,1≤n≤1000;
100%的数据,1≤n≤100000,初始数列的每个数在1和20000之间(包括1和20000)。
【提示】
不需要移动的数之间符合什么规律呢?

这是2010年宁波初中组的一道c++题,请大家帮忙看下。

  • 写回答

3条回答 默认 最新

  • 关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    根据题目描述,要将给定的数列按照不降序排列,并且在移动过程中花费的代价最少。可以按照以下步骤来解决这个问题:

    1. 初始化变量total_cost为0,表示移动的总代价。
    2. 从第二个数开始,遍历数列中的每个数。
    3. 对于每个数,将其与前一个数比较,如果当前数小于前一个数,说明需要移动。
      • 该数的移动代价为其值乘以它与前一个数的距离。
      • 将该数插入到正确的位置。
      • 更新total_cost为total_cost加上移动代价。
    4. 输出total_cost,表示最小代价。

    根据示例输入和输出可以得到以下代码实现:

    n = int(input())
    nums = list(map(int, input().split()))
    
    total_cost = 0
    
    for i in range(1, n):
        if nums[i] < nums[i-1]:
            cost = nums[i] * (i - nums.index(nums[i]))
            total_cost += cost
            nums.remove(nums[i])  # 移除当前数
            nums.insert(i - nums.index(nums[i-1]), nums[i])  # 插入到正确位置
    
    print(total_cost)
    

    这个算法的时间复杂度为O(n^2),其中n是数列的长度。每次移动操作的时间复杂度为O(n),总共有n-1个数需要进行移动。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月10日

悬赏问题

  • ¥15 centos7系统下abinit安装时make出错
  • ¥15 帮看看这个为何无法运行
  • ¥15 hbuildex运行微信小程序报错
  • ¥50 HAL ADCDMA单次触发转换
  • ¥15 关于#python#的问题:我知道这个问题对你们来说肯定so easy
  • ¥15 wpf datagrid如何实现多层表头
  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错