【问题标题】:Can we reduce time complexity of the maximum winner problem? [closed]我们可以降低最大赢家问题的时间复杂度吗? [关闭]
【发布时间】:2020-05-26 00:48:35
【问题描述】:

两支队伍(AB)正在相互竞争。每支球队都有相同数量的球员。两个团队的每个团队成员都有一些与之相关的权力。 一个玩家只有在他们的力量严格大于对手的力量时才能获胜。 A 队的一名球员与 B 队的一名球员配对,按照两队球员的排列方式。我们可以按照我们想要的方式安排两支球队的球员。以这样的方式安排团队,即团队 A 的获胜者多于失败者。

输入格式:
第一行输入包含测试用例的数量,T

每个测试用例的第一行包含每个团队可以拥有的成员数量,N

每个测试用例的第二行由 N 个空格分隔的整数组成,代表团队 A 成员的力量。

每个测试用例的第三行由 N 个空格分隔的整数组成,代表对手 (B) 团队成员的力量。

约束:

  • 1
  • 1
  • 0

输出格式:
对于每个测试用例,打印出团队 A 以最佳方式进行战斗时可以赢得的最大获胜者数量。

解释: 输入:

A队:20、30、50
B队:60、40、25

在上述安排中,A 队只有一名获胜者:最后一名玩家获胜 (50 > 25)。

如果我们这样安排团队:

A队:20、50、30
B组:60、40、25

那么 A 队有 2 名获胜者。玩家 2 和 3,力量 50 > 40 和 30 > 25 将获胜。

另一个测试用例:

1
10
3 6 7 5 3 5 6 2 9 1 
2 7 0 9 3 6 0 6 2 6 

我可以通过首先以非递减顺序对两个数组进行排序来解决这个问题。然后从数组的最后一个索引开始到数组的第一个索引。我设置了两个指针:i 指向A 的末尾,j 指向B 的末尾。然后仅在 A[i]>B[j] 时减少 i 并增加计数。

每次递减 j。

// A: Power of team member A
// B: Power of team member B
// n: size of arrays
while(t--){
    int n;
    cin>>n;
    int A[n],B[n];
    for(int i=0;i<n;i++){
        cin>>A[i];
    }
    for(int i=0;i<n;i++){
        cin>>B[i];
    }

    sort(A,A+n);
    sort(B,B+n);

    // operation
    int count=0;
    int j=n-1;
    for(int i=n-1;i>=0&&j>=0;){
        if(A[i]>B[j]){
            count++;
            i--;
        }
        j--;
    }
    cout<<count<<endl;
}

如果我们使用归并排序,整个操作需要 O(nlog(n))。我们可以降低时间复杂度吗?

【问题讨论】:

  • 给出问题,可以是LLONG_MAX
  • 在我看来,你无法避免对团队进行排序。因此,充其量为 O(n logn),因为在这里计数排序不是一个选项
  • @Damien - 你是对的。

标签: c++ arrays algorithm


【解决方案1】:

因为它是一个贪心算法。我们每次都在选择最佳选择。你做得对。我们需要对两个数组进行排序。如果我们使用归并排序,那么时间复杂度将是O(nlog(n))
算法设计中非常流行的一种说法是can I do batter?。应用不同的方法,然后找出这些方法之间的关系。如果您有额外的时间,请尽量减少时间复杂度。因为你的算法已经足够优化了。

【讨论】:

  • 我认为你的意思是 O(n log n),而不是 O(log n) 的合并排序时间复杂度。
  • 是的,你是对的。打字错误!。我正在改变这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 2014-10-19
相关资源
最近更新 更多