Codeforces Round 908 (Div. 2)题解

B. Two Out of Three

首先,我们根据题意,需要找到一个数组,满足三个条件中的两个,条件如下:

  1. 索引 1≤i,j≤n 中存在 ai=aj , bi=1 , bj=2。
  2. 索引 1≤i,j≤n 中存在 ai=aj , bi=1 , bj=3。
  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;
		}
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值