#include<bits/stdc++.h>
using namespace std;
long long n,k,a[100010];
int check(int mid){
int l=1,r=n,ans=0;
while(l<=r){
while(a[l]+a[r]>mid)r--;
ans+=r-l;
l++;
}return ans>=k;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
long long l=0,r=a[n]*2+1;
while(l+1<r){
long long mid=(l+r)/2;
if(check(mid))r=mid;
else l=mid;
}cout<<l;
return 0;
}
题面
1 个赞
没题目让我们怎么帮你看?
1 个赞
把check里都改为longlong多得10分
2 个赞

while(l<r)
里面的是while(l<r&&a[l]+a[r]>mid)r–;
2 个赞
还有二分是l,r
双指针也是l,r
当然wa
2 个赞
#include<bits/stdc++.h>
using namespace std;
long long n,k,a[100010];
int check(long long mid){
long long x=1,y=n,ans=0;
while(x<=y){
while(x<=y&&a[x]+a[y]>mid)y--;
ans+=y-x;
x++;
}return ans>=k;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
long long l=0,r=a[n]*2+1;
while(l+1<r){
long long mid=(l+r)/2;
if(check(mid))r=mid;
else l=mid;
}cout<<l;
return 0;
}
还错
1 个赞
#include<bits/stdc++.h>
using namespace std;
long long n,k,a[100010];
int check(long long mid){
long long x=1,y=n,ans=0;
while(x<y){
while(x<y&&a[x]+a[y]>mid)y--;
ans+=y-x;
x++;
}return ans>=k;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
long long l=0,r=a[n]*2+1;
while(l+1<r){
long long mid=(l+r)/2;
if(check(mid))r=mid;
else l=mid;
}cout<<l;
return 0;
}
```0 本来还有20
1 个赞
格式化一下
3 个赞
不知道你二分这样对不对我是这样的

3 个赞
我试过了改成我这样能过样例你的不能
2 个赞
#include<bits/stdc++.h>
using namespace std;
long long n,k,a[100010];
int check(long long mid){
long long x=1,y=n,ans=0;
while(x<=y){
while(x<=y&&a[x]+a[y]>mid)y--;
ans+=y-x;
x++;
}return ans>=k;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
long long l=0,r=a[n]*2+1;
while(l<r){
long long mid=(l+r)/2;
if(check(mid))r=mid;
else l=mid;
}cout<<r;
return 0;
}0TLE
1 个赞
![]()
l=mid+1
3 个赞
AC谢谢
2 个赞
解决方案给自己?
4 个赞
给个赞
1 个赞
