空间换时间:
#include <cstring>
#include <cstdio>
#include <iostream>
#include <map>
using namespace std;
int main(){
int t;
cin>>t;
int a[1001];
while(t--){
map<int,int> MAP;
int n,x;
cin>>n>>x;
for(int i=0;i<n;i++){
cin>>a[i];
MAP[a[i]]++;
}
int tag=0;
for(int i=0;i<n;i++){
if(MAP[x-a[i]]){
if(x-a[i]==a[i]&&MAP[a[i]]==1)
continue;
tag=1;
break;
}
}
if(tag){
cout<<"YES"<<endl;
}
else
cout<<"NO"<<endl;
}
return 0;
}
排序动态规划:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int T;
scanf("%d",&T);
while(T--) {
int n, x;
scanf("%d %d", &n, &x);
int p[n];
for(int i=0; i<n; i++){
scanf("%d", &p[i]);
}
sort(p, p+n);
int flag = 0;
int low = 0, high = n-1;
while(low < high) {
if(p[low] + p[high] == x){
printf("YES\n");
flag = 1;
break;
}
else if(p[low] + p[high] < x){
low++;
}
else high--;
}
if(flag == 0) printf("NO\n");
}
return 0;
}