B. Two Out of Three
首先,我们根据题意,需要找到一个数组,满足三个条件中的两个,条件如下:
- 索引 1≤i,j≤n 中存在 ai=aj , bi=1 , bj=2。
- 索引 1≤i,j≤n 中存在 ai=aj , bi=1 , bj=3。
- 存在指数 1≤i,j≤n ,如 ai=aj , bi=2 bj=3。
其实这样我们只需要找到数组中的三个位置分别放入1,2,3就可以满足条件,但这三个位置需要满足 ai=aj,所以在原数组中至少有两个不同的数出现次数大于2. 此时我们可以用二维数组来记录这些数据,并记录满足条件的位置。举例说明这个条件也是充分条件:假设 x,y是两个在数组中出现不止一次的数字。那么我们可以将 ai=x→bi=2 赋值给其中一个出现过的数,将 ai=y→bi=3赋值给其中一个出现过的数,将 bi=1赋值给所有其他的数,这将是一个合适的答案。
接下来放代码:
#include<bits/stdc++.h>
using namespace std;
int t,n;
const int N=110;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
vector<int> a(n); //存放原数组
for(int i=0;i<n;i++){
cin>>a[i];
}
vector<vector<int>> inx(N); //记录所有数出现次数和出现的位置
vector<int> b(n,1); //结果数组,初始值都设为1
for(int i=0;i<n;i++)
{
inx[a[i]].push_back(i);
}
int k=2;
for(int i=1;i<=100;i++)
{
if((int)inx[i].size()>=2){
b[inx[i][0]]=k;
k++;
if(k>3)break; //在刚开始我们知道要满足条件只需要将1,2,3放在合适的位置,这里我们找到了两个分别是2和3,因为我们设置b数组初始值都为1,所以不用再找1所在的位置
}
}
if(k<=3){
cout<<-1<<endl;
}
else{
for(int i=0;i<n;i++){
cout<<b[i]<<" ";
}
cout<<endl;
}
}
}