二分解方程

图片说明

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。

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务