490A. Team Olympiad
贝兰德首府的 0 号学校有 n 名学生。这所学校的所有孩子都很有天赋:有的擅长编程,有的擅长数学,还有的擅长体育。因此,我们知道每个孩子的数值为 ti :
- ti = 1 ,如果第 i 个孩子擅长编程;
- ti = 2 ,如果第 i 个孩子擅长数学;
- ti = 3 ,如果第 i 个孩子擅长体育;
每个孩子恰好擅长这三个科目中的一个。
团队科学十项全能奥林匹亚竞赛要求三个学生组成一个团队。学校老师决定,这些团队将由三个擅长不同科目的孩子组成。也就是说,每支队伍必须有一名数学家、一名程序员和一名运动员。当然,每个孩子最多只能参加一支队伍。
学校最多能派出多少支队伍参加奥林匹克竞赛?应该如何组队?
输入
第一行包含整数 n ( 1 ≤ n ≤ 5000 )–学校的儿童人数。第二行包含 n 个整数 t1, t2, …, t**n ( 1 ≤ t**i ≤ 3 ),其中 t**i 描述了第 i 个孩子的技能。
输出
第一行输出整数 w - 可能的最大队伍数。
然后打印 w 行,每行包含三个数字。每个三位数代表组成团队的子代的索引。您可以按照任意顺序打印队伍和三连音中的数字。孩子们的编号从 1 到 n ,按他们在输入中出现的顺序排列。每个孩子最多只能参加一个小组。如果有多个解决方案,则打印其中任何一个。
如果无法编译出团队,则打印唯一一行值 w 等于 0 的行。
例如
输入
7
1 3 1 3 2 1 2
输出
2
3 5 2
6 7 4
输入
4
2 1 1 2
输出
0
解决方法:
// CODEFORCES
// 490A. Team Olympiad
# include<iostream>
using namespace std;
int main()
{
int n, m;
cin >> n;
int t1[n], t2[n], t3[n], tm[n];
for(int i = 1; i <= n; i++)
{
t1[i] = 0;
t2[i] = 0;
t3[i] = 0;
cin >> m;
tm[i] = m;
}
int j = 0, t = 0, k = 0;
for(int i = 1; i <= n; i++)
{
if(tm[i] == 1)
{
t1[++j] = i;
}
else if(tm[i] == 2)
{
t2[++t] = i;
}
else
{
t3[++k] = i;
}
}
int sum = 0;
int ans[n][4];
for(int i = 1; i <= n; i++)
{
if(t1[i] != 0 && t2[i] != 0 && t3[i] != 0)
{
++sum;
ans[sum][1]=t1[i];
// cout << sum << ans[sum][1] <<' ';
ans[sum][2]=t2[i];
// cout << sum << ans[sum][2] << ' ';
ans[sum][3]=t3[i];
// cout << sum << ans[sum][3] << endl;
}
}
if(sum == 0)
{
cout << sum << endl;
}
else
{ cout << sum << endl;
for(int i = 1; i <= sum; i++)
{
cout << ans[i][1] <<' '<< ans[i][2] << ' '<< ans[i][3] <<endl;
}
}
return 0;
}