题目描述:
给出n个不同的正整数a[1]~a[n],它们的值在1~1,000,000之间。再给定一个整数x,编程计算这样的数对个数(a[i],a[j]),1<=i<j<=n,并且a[i]+a[j]=x。
输入格式:
第1行1个正整数n,1<=n<=100,000。
第2行n个正整数,表示元素a[1]~a[n],每两个数之间用一个空格分隔。
第3行1个正整数x,1<=x<=2,000,000。
输出格式:
一行一个整数,表示这样的数对个数。
样例输入:
9 5 12 7 10 9 1 2 3 11 13
样例输出:
3
提示:
样例说明:
不同的和为13的数对是(12,1),(10,3)和(2,11),共3对。
时间限制: 1000ms
空间限制: 256MB
代码实现:
(脑残开了个结构体哈希表)
#include<bits/stdc++.h>
using namespace std;
long long a[100005],n,m,ans;
struct Node{
int flag=0,j;//flag表示是否用过这个数,j表示这个数的下标
}has[1000005];
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],has[a[i]].flag=1,has[a[i]].j=i;
cin>>m;
for(int i=1;i<=n;i++){
has[a[i]].flag=0;
if(has[m-a[i]].flag&&has[a[i]].j<has[m-a[i]].j)ans++,has[m-a[i]].flag=0/*,cout<<a[i]<<" "<<m-a[i]<<"\n"*/;
}
cout<<ans;
return 0;
}