当前位置:   article > 正文

蓝桥杯pythonB组(小白逆袭之路)_最小化战力差距问题python

最小化战力差距问题python

最小化战斗力差距

问题描述

小蓝是机甲战队的队长,他手下共有n名队员,每名队员都有一个战斗力值 wi。现在他需要将这n名队友分成两组a和6,分组必须满足以下条件
。每个队友都属于a组或6组
。a组和6组都不为空
。战斗力差距最小。
战斗力差距的计算公式为max(a)min(6),其中max(a)表示a组中战斗力最大的,min(6)表示6组中战斗力最小的。
请你计算出可以得到的最小战斗力差距

import os

import sys

n=int(input())

w=list(map(int,input().split()))

a=float('inf') #zheng

w.sort()

for i in range(1,n):

    a=min(a,w[i]-w[i-1])

print(a)

 

解题思路

我们假设 \max(a)max(a) 为 xx,\min(b)min(b) 为 yy。求解 |x-y|∣x−y∣ 的最小值,本质上就是要使得 xx 和 yy 的相对距离最小。对于数组来说,将其排序后,相邻元素之间的相对距离一定是最小的,即答案为数组排序后所有相邻元素差值的最小值。

我们需要考虑这样排序后的构造是否是合法的,实际上可以构造一种满足条件的分组方法:假设对于排序后随意一组相邻的两个元素,左边的元素设为 ll,右边的元素为 rr,因为数组有序,所以 ll 左边的元素均不大于 ll,于是我们可以将 ll 左边的元素和 ll 视为 aa 组;同时 rr 右边的元素均不小于 yy,我们可以将 rr 右边的元素和 rr 视为 bb 组。这样就能够保证 ll 一定是 \max(a)max(a),rr 一定是 \min(b)min(b),即分组可行。

具体实现时,我们只需要将数组排序,然后在任意两个相邻元素的差值中取最小的即为答案。

时间复杂度为 O(n \log n)​O(nlogn)​。

AC_Code

  • C++
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. int main()
  5. {
  6. ios_base :: sync_with_stdio(false);
  7. cin.tie(0); cout.tie(0);
  8. cin >> n;
  9. std::vector<int> a(n);
  10. for (int i = 0; i < n; ++i) cin >> a[i];
  11. sort(a.begin(), a.end());
  12. int ans = 1e9;
  13. for (int i = 1; i < n; ++i) ans = min(ans, a[i] - a[i - 1]);
  14. cout << ans << '\n';
  15. return 0;
  16. }

  • Java
  1. import java.util.*;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner scan = new Scanner(System.in);
  5. int n = scan.nextInt();
  6. int[] a = new int[n];
  7. for (int i = 0; i < n; ++i) {
  8. a[i] = scan.nextInt();
  9. }
  10. Arrays.sort(a);
  11. int ans = Integer.MAX_VALUE;
  12. for (int i = 1; i < n; ++i) {
  13. ans = Math.min(ans, a[i] - a[i - 1]);
  14. }
  15. System.out.println(ans);
  16. }
  17. }

  • Python
  1. n = int(input())
  2. a = list(map(int, input().split()))
  3. a.sort()
  4. ans = float('inf')
  5. for i in range(1, n):
  6. ans = min(ans, a[i] - a[i - 1])
  7. print(ans)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/466592
推荐阅读
相关标签
  

闽ICP备14008679号