M题
题意:给你一串数字,让你找出i<j<k时,满足a[j]-a[i]=a[k]-a[j]条件的三数对的个数。
解题思路:将条件转换一下,变成a[k]=2*a[j]-a[i].然后看代码吧。。。
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
const int N=2010;
int a[N];
map<int,int> mp;
int main()
{
int t;
cin>>t;
while(t--)
{
mp.clear();
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
mp[a[i]]++;
}
mp[a[0]]--;
int ans=0;
for(int i=1;i<n;i++)
{
mp[a[i]]--;
for(int j=0;j<=i-1;j++)
{
int x=2*a[i]-a[j];
if(mp.count(x)) ans+=mp[x];
}
}
cout<<ans<<endl;
}
return 0;
}
注意:if(mp.count(x)) ans+=mp[x];这个语句,一定要用mp.count()判断一下个数是否为0,不判断的话会超时,原因不知道。
之前写的程序,是以a[j]为基本点,向a[j]的前面和后面暴力枚举,查找满足a[j]-a[i]=a[k]-a[j]条件的三数对的个数。
//错误代码
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int a[2001];
map<int,int> mp;
int main()
{
//freopen("input.txt","r",stdin);
int t,n,ans;
cin>>t;
while(t--)
{
// mp.clear();
ans=0;
cin>>n;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=1;i<n-1;i++)
{
mp.clear();
for(int j=0;j<i;j++) mp[a[i]-a[j]]++;
for(int k=i+1;k<n;k++)
if(mp.count(a[k]-a[i])) ans+=mp[a[k]-a[i]];
}
cout<<ans<<endl;
}
return 0;
}
错误的原因感觉应该是map.clear()的时间复杂度有点高,我的程序用的clear次数比正确代码要多得多。