题目描述
给出n个整数和x,请问这n个整数中是否存在三个数a,b,c使得ax2+bx+c=0,数字可以重复使用。
输入描述:
第一行两个整数n,x
第二行n个整数a[i]表示可以用的数
1 <= n <= 1000, -1000 <= a[i], x <= 1000
输出描述:
YES表示可以
NO表示不可以
示例1
输入
2 1 1 -2
输出
YES
解法:暴力即可,时间复杂度O(n^3)
#include<iostream> #include<stdio.h> #include<queue> #include<stack> #include<string.h> using namespace std; int a[1005]; int main() { int n,x; while(scanf("%d%d",&n,&x)!=EOF) { memset(a,0,sizeof(a)); for(int i = 0; i < n ; i++) scanf("%d",&a[i]); int flag = 0; for(int i = 0; i < n ; i++) { for(int j = 0; j < n ;j++) { for(int k = 0; k < n ; k++) { if(a[i]*x*x + a[j]*x + a[k] == 0) { flag = 1; } } } } if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }
法二:二分查找,时间复杂度O(n^2log(n))
#include<bits/stdc++.h> using namespace std; int main() { int n,a[1005],x; while(scanf("%d%d",&n,&x)!=EOF) { for(int i = 0; i < n; i++) scanf("%d",&a[i]); sort(a,a+n); int flag = 0; for(int i = 0 ; i < n; i++) { for(int j = 0; j < n ; j++) { int c = -(a[i]*x*x + a[j]*x); //二分查找c是否在给定的数组中 int l = 0, r = n - 1; while(l < r) { int mid = (l+r)>>1; if(a[mid] == c) flag = 1; if(c > a[mid]) { l = mid + 1; } else { r = mid; } } } } if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }