题意:给你一个长为n的数组a,给一个T,定义f(x)为x数组中ai +aj=T(i<j)的对数,将a数组分成c,d两个数组,使得f©+f(d)的值最小
题解:运用map即可,定义两个map容器m1,m2分别记录c,d数组中的数出现的次数。遍历一遍数组,若T-ai 在m1中不存在则直接放进去,若T-ai在m1中存在则再判断m2中T-a[i]是否存在,然后将a[i]放入T-a[i]数量较小的那一个容器中。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll t,n,T,a[100005];
cin>>t;
while(t--)
{
cin>>n>>T;
map<ll,ll> m1,m2; //m1 m2分别表示 c d两个数组
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
if(m1[T-a[i]]>0) //如果m1中已存在 T-a[i]
{
if(m1[T-a[i]]>m2[T-a[i]])
{
m2[a[i]]++; //若m1中T-a[i]的数量较多,则就把a[i]放在m2中
a[i]=0;
}
else
{
m1[a[i]]++; //若m2中T-a[i]的数量较多,就把a[i]放在m1中
a[i]=1;
}
}
else
{
m1[a[i]]++;
a[i]=1;
}
}
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
}