这道题其实吧,水,我们教练说过,不要看标签,这只是CSP第一题的题目
思路嘛,priority_queue和贪心,就这样,很水
这是代码
还有,一定要在cf上交,不然……可以看一下提交记录,有几个人的代码回来了
Code
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int MAXN = 1e6 + 5;
inline int read(){
int k = 0,f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if (ch == '-'){
f = -1;
}
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
k = k * 10 + ch - '0';
ch = getchar();
}
return k * f;
}
inline void write(int x){
if (x < 0){
putchar('-');
x = -x;
}
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
struct node{
int cnt,num,id;
node(){}
node(int Cnt,int Num){
cnt = Cnt,num = Num;
}
bool operator <(const node& a) const{
return cnt < a.cnt;
}
}a[MAXN];
priority_queue <node> q;
int cnt = 1;
int ans;
struct ball{
int big,mid,sma;
}k[MAXN];
bool cmp(node x,node y){
return x.num < y.num;
}
int main(){
int n;
n = read();
for (int i = 1; i <= n ; i++) a[i].num = read();
sort(a + 1,a + 1 + n,cmp);
for (int i = 1; i <= n; i++){
if (a[i].num != a[i + 1].num){
q.push(node(cnt,a[i].num));
cnt = 1;
}
else cnt++;
}
if (q.size() < 3){
printf("0");
return 0;
}
while(q.size() >= 2){
node x = q.top();q.pop();
node y = q.top();q.pop();
node z = q.top();q.pop();
x.cnt--,y.cnt--,z.cnt--;
k[++ans].big = x.num;
k[ans].mid = y.num;
k[ans].sma = z.num;
if (x.cnt) q.push(node(x.cnt,x.num));
if (y.cnt) q.push(node(y.cnt,y.num));
if (z.cnt) q.push(node(z.cnt,z.num));
}
write(ans);
putchar(10);
for (int i = 1 ; i <= ans ; i++){
int m[5];
m[1] = k[i].big;
m[2] = k[i].mid;
m[3] = k[i].sma;
sort(m + 1,m + 4);
printf("%d %d %d\n",m[3],m[2],m[1]);
}
return 0;
}