给出n个整数和x,请问这n个整数中是否存在三个数a,b,c使得ax2+bx+c=0,数字可以重复使用。
- 二分法的中的while等号问题:一定要有等号(不然就是侥幸在样本中过关);
- break跳出循环多的时候可以选择直接return 0;结束函数(main()也是);
-
if(a[mid]>N) h=mid-1; //难点记忆 else if(a[mid]<N) l=mid+1;
记忆:mid大于 h-1,mid小于 l+1;high & low;
#include<iostream> #include<cmath> #include<algorithm> #include<string> using namespace std; int n,x,flag=0,l,h; int a[2010]; int findC(int N) { int mid; l=0;h=n-1; while(l<=h) { mid=(l+h)/2; if(a[mid]>N) h=mid-1; //难点记忆 else if(a[mid]<N) l=mid+1; else return 1; } return 0; } int main(){ cin>>n>>x; for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ int c=a[i]*pow(x,2)+a[j]*x; if(findC(-c)){ flag=1; //无break } if(flag==1){ puts("YES"); return 0; //return 0结束,并且这个if是在第二个循环内判断的,得结果速度应该会更快,但多次运行后发现会导致内存占用更大 } } } if(flag==0) puts("NO"); return 0; }