超时代码:
最容易想到的,时间复杂度o(n*n),我一以为先排个序,在嵌套循环会快点,能AC掉,提交后发现还是我想多了…
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int t,n,x,a[100000],tag;
cin>>t;
while(t--){
tag=1;
cin>>n>>x;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
for(int i=0;a[i]<x&&i<n;i++){
for(int j=i;a[j]<x&&j<n;j++){
if(a[i]+a[j]==x){
cout<<"YES"<<endl;
tag=0;
break;
}
}
if(tag==0)
break;
}
if(tag)
cout<<"NO"<<endl;
}
return 0;
}
空间换时间的代码:
今天刚学了点map的映射,用了用,发现针不锉!嘻嘻~就是空间用的是真的多…
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int main(){
int t,n,x,a[100000],tag;
cin>>t;
while(t--){
map<int,int> num;
tag=1;
cin>>n>>x;
for(int i=0;i<n;i++){
cin>>a[i];
num[a[i]]++;
}
for(int i=0;i<n;i++){
if(num[x-a[i]]>0){
cout<<"YES"<<endl;
tag=0;
break;
}
}
if(tag)
cout<<"NO"<<endl;
}
return 0;
}
完美代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int T, n, X,arr[100000],flag;
cin>>T;
while(T--) {
cin>>n>>X;
flag=0;
for(int i=0; i<n; i++) cin>>arr[i];
//排序
sort(arr,arr+n);
for(int l=0,r=n-1; l!=r;) {
if(arr[l]+arr[r]>X) r--;
else if(arr[l]+arr[r]<X) l++;
else {
flag=1;
break;
}
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}