我们能否降低最大赢家问题的时间复杂度?
Can we reduce time complexity of the maximum winner problem?
两支队伍(A和B(正在相互竞争。每支球队都有相同数量的球员。两个团队的每个团队成员都有与他们相关的一些权力。只有当玩家的力量严格大于对手的力量时,玩家才能获胜。A队的球员与B队的球员配对,按照两队球员的排列方式。我们可以按照我们想要的方式安排两支球队的球员。以这样一种方式安排团队,即团队 A的赢家多于输家。
输入格式:
输入的第一行由测试用例的数量组成,T
每个测试用例的第一行由每个团队可以拥有的成员数N组成。
每个测试用例的第二行由N 个空格分隔的整数组成,表示团队A成员的幂。
每个测试用例的第三行由N 个空格分隔的整数组成,代表对手 (B( 团队成员的力量。
约束:
- 1 <= T <=100000
- 1 <= N <=100000
- 0 <= 团队成员的力量 <= LLONG_MAX
输出格式:
对于每个测试用例,打印如果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((。我们可以降低时间复杂度吗?
因为它是一个贪婪的算法。我们每次都在选择最佳选择。你做对了。我们需要对两个数组进行排序。如果我们使用合并排序,那么时间复杂度将O(nlog(n))
。
算法设计中非常流行的一种说法是can I do batter?
。应用不同的方法,然后找出这些方法之间的关系。如果您有额外的时间,请尝试尽量减少时间复杂度。因为你的算法已经足够优化了。
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 具有嵌套 if-else 的循环的时间复杂度
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 如何计算函数的时间复杂度?
- 求解包含"variables"的 T(n) 时间复杂度
- 查找数字是否为 2 的幂的时间复杂度
- C++ - 最坏情况和平均情况插入时间复杂度在 std::unordered_map <int,int>?
- 为什么一种算法在相同的时间复杂度下比另一种算法更快?
- 关于记忆后这种递归关系的时间复杂度
- 我们能否降低最大赢家问题的时间复杂度?
- 递归回文问题的时间复杂度,C++
- 如何降低此问题中的时间复杂度