【问题标题】:Minimum operation to make an array good [closed]使数组良好的最小操作[关闭]
【发布时间】:2021-10-31 09:14:02
【问题描述】:

给定一个包含 N 个整数的数组 A。还给你一个整数 K。如果 A[i]<=A[i + k]i = 1, 2, 3,.., n - k 则数组是好的 在一次操作中,您可以选择任何元素并将其转换为任意整数。

任务

确定使数组良好的最小操作数。 注意:假设基于 1 的索引。

我尝试了什么

int lis(std::vector<int>& a){

    if(a.size() == 0) return 0;

    vector<int> b;

    b.push_back(a[0]);

    for(int i = 1; i < a.size(); i++){

        if(b.back() <= a[i]) b.push_back(a[i]);

        else{

            int idx = lower_bound(b.begin(), b.end(), a[i]) - b.begin();

            b[idx] = a[I];

        }

    }

    return b.size();

}


int minOperations(int n, vector<int> a, int k){

    int cost = 0;

    for(int i = 0; i < k; i++){

        vector<int> b;

        for(int j = i; j < n; j+=k) {

            b.push_back(a[j]);

        }

        cost += b.size() - lis(b);

    }

    return cost;
}

部分正确

【问题讨论】:

  • 这与 Python 有什么关系?
  • 这个问题是在 HE 平台上的 Amazon Test 中提出的。我说的对吗?
  • for (int i=0;iA[K+i]&& K+i 但包括它以供参考 if(A[i]

标签: c++ arrays


【解决方案1】:

如果k=1,则数组排序时满足条件。 如果 k=2,如果索引为 [0, 2, 4, 6 ...] 的数组切片已排序,索引为 [1, 3, 5, 7, ...] 的数组切片已排序,则满足条件.

基本上,您将数组拆分为 k 个子数组,然后必须确保这些切片已排序。对吗?

在这种情况下,您所要做的就是创建一个以给定值 k 递增的自定义迭代器,然后对所有子数组调用 sort。

最小操作数现在是排序算法中的操作数。如果您只需要估计,我会选择 O(k * (n/k * log(n/k))) = O(n log(n/k))。

如果您确实需要计数操作,则需要覆盖 std::sort 中的交换和比较操作,这是可行的,但在您验证这是您需要的之前,我不会编写代码。

【讨论】:

  • for (int i=0;iA[K+i]&& K+i 但包括它以供参考 if(A[i]
  • @chandru 你能详细说明一下吗?您没有计算足够的操作来对切片进行排序。此外,if 语句的第二部分 (K+i&lt;N) 是多余的。您的循环在达到条件之前停止。无论如何,检查都为时已晚。给定操作顺序,您将访问 A 超出其限制
  • 我正在尝试计算 [i]>[i+k] 的值,而 K+i
  • @chandru 但是,计数不足以使数组“好”,因为简单地交换 A[i]A[K+i] 并不能保证 A[i] &gt;= A[i-K](前一个)将保持不变.这就像一轮冒泡排序。 K+i&lt;N 检查是不必要的,因为您的 for 循环已经只转到 i&lt;N-K
  • 因为它只需要操作计数,所以我想计数但不交换。我也尝试将 K 添加到 A[0 到 N] 但这没有用。问题是检查使数组良好所需的最小操作,因此我们只需要计算操作数。
猜你喜欢
  • 1970-01-01
  • 2021-04-16
  • 2021-12-20
  • 2011-09-12
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 2022-10-23
相关资源
最近更新 更多