算是一道考验思维的题吧,关键在于看出来如果要距离红球比篮球近的话那必然不能跨越篮球。那么就需要红球扎堆,也就是说红球扎堆的越多就有更多的胜利。
那么就到了统计红球的个数了。可以使用前缀和来求解。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5+10;
//1代表红色,0代表蓝色
map<int, int, greater<int>> mp;
map<int, int> ct;
int main() {
int T, n, m, cnt = 0, k;
cin>>T;
while (T--) {
scanf("%d %d", &n, &m);
ct.clear();
mp.clear();
cnt =0 ;
int ans = 0;
for (int i=0;i<n;i++) {
scanf("%d", &k);
ct[k]++;
mp[k] = 1;
}
for (int i=0;i<m;i++) {
scanf("%d", &k);
mp[k]= 0;
}
//遍历一遍计算前缀和
for (auto p: mp) {
if (p.second==1) cnt+=ct[p.first];
else cnt = 0;
ans = max(ans, cnt);
}
if (ans==0)
cout<<"Impossible\n";
else
cout<<ans<<endl;
}
return 0;
}

京公网安备 11010502036488号