题意解读:
如果初始化b全是1的话,让出现次数>1的数字分组找两个位置换成2和3
比如111777999按179分成三组,如果三个1里面找一个数对应b数组改成2,三个7里面找一个把b数组改成3,那么三个9对应的b数组就不用动了
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int T, n, a[N], ans[N], cnt[N];
int main() {
cin >> T;
while (T--) {
memset(cnt, 0, sizeof(cnt));
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= n; ++i) ans[i] = 1;
int cur = 1;
for (int i = 1; i <= n; ++i) {
if (cnt[a[i]] == 1) {
ans[i] = ++cur;
if (cur == 3) break;
}
++cnt[a[i]];
}
if (cur == 3) {
for (int i = 1; i <= n; ++i)
cout << ans[i] << ' ';
cout << '\n';
} else {
cout << "-1\n";
}
}
return 0;
}
2(还没看懂版):
#include <stdlib.h>
#include <iostream>
#include<cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <map>
#include <set>
#include<iomanip>
#include<queue>
#include<stack>
//#define int long long
//#define endl '\n'
//cout << fixed << setprecision(2) << 3.1415 << endl;
using namespace std;
const int N1=2e5+10;
const int N2=3e4+10;
typedef pair<int , int> PII;
int a[105],arr[105];
void solve(){
int n;
cin >> n;
memset(a,0,sizeof(a));//初始化一下a数组全为0,是记录次数的
for(int i = 1; i <= n; ++ i)
{
cin >> arr[i];//arr数组负责读取数据
a[arr[i]]++;//a数组负责记录这个数出现了多少次
}
int cnt = 0,fir = -1,sec = -1;//?
for(int i = 1; i <= 100; ++ i)
{
if(a[i] >= 2)
{
//进入这里面说明i这个数字出现过两次及以上
cnt++;//记录有多少个数字存在 次数大于二的
sec = fir;//相当于把原来sec的赋值给fir了,然后再把新的赋值给fir
fir = i;
//这里的fir和sec是分别对应我们后面要输出的那两对特殊数字22,33,其他的都是1
}
}
if(cnt < 2)//如果只有0或1对,则输出-1结束程序
{
cout << "-1\n";
return;
}
for(int i = 1; i <= n; ++ i)
{
if(arr[i] == fir)//如果是记录下来的fir 所在的位置,就输出2
{
cout << "2 ";
fir = -1;
}
else if(arr[i] == sec)//如果是记录下来的fsec 所在的位置,就输出3
{
cout << "3 ";
sec = -1;
}
else cout << "1 ";//其他位置,都输出1
}
cout<<endl;
}
signed main()
{
int turn=1;
cin>>turn;
while(turn--)
{
solve();
}
}
这是什么翻译软件