解方程
链接 https://ac.nowcoder.com/acm/problem/14416
来源 牛客网
时间限制 C/C++ 1秒,其他语言2秒
空间限制 C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
给出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
思路:两种做法,一种是直接暴力枚举,另一种是二分
法一:枚举
#include<iostream>
using namespace std;
const int N = 1010;
int a[N];
int main()
{
int n, x;
cin >> n >> x;
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
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) //三重循环枚举数组元素,如果满足条件就输出YES,否则最后输出NO
{
printf("YES\n");
return 0;
}
}
}
}
printf("NO\n");
}
法二:二分
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1010;
int a[N];
int n, x;
bool flag;
inline bool binary(int c)
{
int l = 0, r = n - 1, mid;
while(l < r)
{
mid = (l + r) >> 1;
if(a[mid] == c) return true;
else if(a[mid] < c) l = mid + 1;
else r = mid;
}
return false;
}
signed main()
{
cin >> n >> x;
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
sort(a, a + n);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
int c = -1 * (a[i] * x * x + a[j] * x); //给排好序的数组a中二分查找c
flag = binary(c);
if(flag)
{
printf("YES\n");
return 0;
}
}
}
printf("NO\n");
return 0;
}