二分解方程
import java.io.IOException;
import java.util.*;
public class Main {
static boolean check(int s,int a[]){
int l = 0,r = a.length - 1,mid = 0;
while(l<=r){
mid=(l+r)/2;
if(a[mid]>s){
r=mid-1;
}else if(a[mid]<s){
l=mid+1;
}else {
return true;
}
}
return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int x = sc.nextInt();
int a[] = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
Arrays.sort(a);
int c = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
c = a[i] * x * x + a[j] * x;
if(check(-c,a)){
System.out.println("YES");
return;
}
}
}
System.out.println("NO");
}
}
##从题目看还是挺简单的如果用暴力的话,但是用二分就没那么简单了(至少对于现在这个水平哈哈哈)。很简单就是让结果等于0,x已经给出,那么直接让c = a[i *x * x + a[j * x。那么结果就等于0了,既然找到等式之后,那么就在两个for循环内用check(因为数字可以重复利用)。二分方法也是很简单,查找数组中适合的c值,如果存在就true。