【发布时间】:2020-05-26 00:48:35
【问题描述】:
两支队伍(A 和 B)正在相互竞争。每支球队都有相同数量的球员。两个团队的每个团队成员都有一些与之相关的权力。 一个玩家只有在他们的力量严格大于对手的力量时才能获胜。 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 - 你是对的。