百度:度度熊有一个N个数的数组,他想将数组从大到小排好序...

度度熊有一个N个数的数组,他想将数组从大到小排好序,但是萌萌的度度熊只会下面这个操作:
任取数组中的一个数然后将它放置在数组的最后一个位置.
问最少操作多少次可以使得数组从小到大有序?

输入描述:
首先输入一个正整数N,接下来的一行输入N个整数。(N <= 50, 每个数的绝对值小于等于1000)

输出描述:
输出一个整数表示最少的操作次数。

输入例子:
4
19 7 8 25

输出例子:
2

思路很简单,使用vcetor来装数组,使用map放value和index。
首先,对vector进行排序,这样我们会发现,vector中的值在map的索引号应该逐渐增大。
当发现vector中较大的值对应map中的索引号较小,应该把vector中较大的值对应的map中的索引号
以vector.size()为基数增大。
这里写代码片
#include "iostream"
#include "vector"
#include "map"
#include "algorithm"

using namespace std;
int main()
{
    int N,value;
    
百度应用平台上有很多有趣的应用,每个应用都由一个开发者开发,每个开发者可能开发一个或多个应用。百度的工程师们把应用尽可能好的推荐给用户。 研究发现,同一个开发者开发的程的图标有很的相似性。如果把同一个开发者开发的应用放在一起,用户很快就会厌倦相似的图标,如果把这些图标穿插摆放效果就会好很多。 现在工程师给用户推荐来自m个开发者的n个应用,在推荐的时候这些应用的图标将排成整齐的一行展示给用户,相邻两个图标之间的距离正好是1,工程 师们让这些图标尽可能的穿插摆放。为了衡量穿插摆放的效果,给每个图标定义一个“分离度”,分离度的值是指当前图标和它左边最近的来自同一个开发者的图 标之间的距离。如果一个图标左边没有来自同一个开发者的图标,则分离度为0。所有图标穿插摆放效果的值定义为所有图标的分离度之和。 已知每个开发者开发的应用个数,请帮助百度的工程师找到图标穿插摆放效果的最值。 格式 输入格式: 输入的第一行包含两个整数n和m,用一个空格分隔,分别表示应用的个数和开发者的个数。 第二行包含m个正整数,相邻两个数之间用一个空格分隔,表示每个开发者开发的应用个数,这些整数之和必然等于n。 提示: 对于20%的数据,n≤ 10; 对于40%的数据,n≤ 100。 对于100%的数据,1≤ m ≤ n ≤ 100,000 输出格式: 输出一个整数,表示图标穿插摆放效果的最值。 样例 1 输入: 8 3 3 3 2 输出: 15 用C语言生成
最新发布
06-11
这是一个经典的贪心算法问题。目标是通过穿插摆放来自不同开发者的应用图标,最化分离度之和。 ### 解题思路 1. **分析分离度**:对于某个开发者开发的第 `i` 个图标,它的分离度取决于它与之前最近的一个同开发者图标的距离。如果我们让这些图标尽可能分散,则可以最化分离度。 2. **贪心策略**:优先安排应用数量最多的开发者,这样可以让他们的图标更分散,从而提高整体的分离度。 3. **实现步骤**: - 按照每个开发者开发的应用数量从到小排。 - 使用一个变量 `pos` 来记录当前放置图标的总位置。 - 对于每个开发者,依次将他的图标放置在尽可能远的位置,并计算对应的分离度。 ### C语言代码实现 以下是使用C语言实现的解决方案: ```c #include <stdio.h> #include <stdlib.h> // 比较函数,用于qsort降排列 int compare(const void *a, const void *b) { return (*(int*)b - *(int*)a); } int main() { int n, m; scanf("%d %d", &n, &m); // 读取每个开发者的应用数量 int developers[m]; for (int i = 0; i < m; i++) { scanf("%d", &developers[i]); } // 按照应用数量从到小排 qsort(developers, m, sizeof(int), compare); long long total_separation = 0; // 总分离度 int pos = 0; // 当前放置图标的总位置 for (int i = 0; i < m; i++) { int count = developers[i]; // 当前开发者的应用数量 for (int j = 1; j < count; j++) { pos++; // 放置下一个图标 total_separation += pos; // 累加分离度 } pos++; // 更新位置到下一个开发者的第一张图标 } printf("%lld\n", total_separation); // 输出结果 return 0; } ``` --- ### 代码解释 1. **输入处理**: - 首先读取应用总数 `n` 和开发者数 `m`。 - 接着读取每个开发者开发的应用数量,并存储在数组 `developers` 中。 2. **排**: - 使用 `qsort` 函数对 `developers` 数组进行降排列,确保应用数量多的开发者优先处理。 3. **计算分离度**: - 初始化 `total_separation` 为 0,用于累加所有图标的分离度。 - 遍历每个开发者,对其应用逐一放置,并更新分离度。 - 每次放置一个新的图标时,`pos` 表示当前图标的位置,`total_separation` 累加 `pos`。 4. **输出结果**: - 最后输出总的分离度 `total_separation`。 --- ### 样例运行 #### 输入: ``` 8 3 3 3 2 ``` #### 运行过程: - 开发者按应用数量排为:[3, 3, 2]。 - 第一个开发者放置图标的位置为:0, 2, 4,分离度分别为 0, 2, 4。 - 第二个开发者放置图标的位置为:1, 3, 5,分离度分别为 0, 2, 4。 - 第三个开发者放置图标的位置为:6, 7,分离度分别为 0, 1。 - 总分离度为:0 + 2 + 4 + 0 + 2 + 4 + 0 + 1 = 15。 #### 输出: ``` 15 ``` --- ### 时间复杂度分析 - **排**:`O(m log m)`。 - **遍历开发者和应用**:`O(n)`。 - 综合时间复杂度为 `O(m log m + n)`,可以满足题目中 `n ≤ 100,000` 的要求。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值