2021年-PTA模拟赛-L2-2 三足鼎立(二分查找+思路)
思路:
把国家实力都存入数组中,排序后,遍历。
在for循环中,可以将问题简化成,已知两边,求另一边的取值范围,然后在数组里面使用二分查找,找到这个区间,这个区间在我的代码中是前闭后开区间,因此r - l就是一次循环得到的符合条件的第三边的个数
lower_bound()和upper_bound()用法
AcCode:
#include<bits/stdc++.h>
using namespace std;
long ct[100010];
int main(){
long N, M, res = 0;
cin >> N >> M;
for(int i = 0; i < N; i++){
cin >> ct[i];
}
sort(ct, ct + N);
for(int i = 0; i < N; i++){
long l = upper_bound(ct + i + 1, ct + N, abs(M - ct[i])) - ct; //c++STL库函数
long r = lower_bound(ct + i + 1, ct + N, M + ct[i]) - ct; //c++STL库函数
res += r - l;
}
cout << res;
return 0;
}