题目链接:http://codeforces.com/contest/140/problem/C
题目大意:
有n个雪球(半径为:r,r,r.....r);一个雪人要三个雪球。但是要求半径两两不相同。
求可以堆雪人数量的最大值。
输入
第一行n代表了雪球数量。
第二行,n个数字代表了雪球的半径。
输出
第一行 k 代表了可以堆几个雪人
下面k行,输出每个雪人的雪球半径。(由大到小,空格隔开)。
各个雪人的顺序不定。
若有多种情况,输出其一。【应该指代k相同的情况下,有多种情况】
分析:
很明显是贪心,不过贪心策略有待斟酌。
一开始我想当然的把数据按大小排序后从小到大贪心,结果就Wa了,很容易找到反例:1 2 3 4 4 4 5 5 5
如果从小到大贪,那么答案为1,不过这组数据眼睛看看答案都应该是3。造成这种情况的原因是我把数量少的先贪掉了,很多数量多的没得贪。因此贪心策略应该先贪数量多的。
代码如下:
#include <bits/stdc++.h>
using namespace std; #define rep(i,n) for (int i = 0; i < (n); ++i)
#define For(i,s,t) for (int i = (s); i <= (t); ++i)
#define rFor(i,t,s) for (int i = (t); i >= (s); --i)
#define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
#define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i) #define pr(x) cout << #x << " = " << x << " "
#define prln(x) cout << #x << " = " << x << endl #define LOWBIT(x) ((x)&(-x)) #define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin()) #define ms0(a) memset(a,0,sizeof(a))
#define msI(a) memset(a,inf,sizeof(a))
#define msM(a) memset(a,-1,sizeof(a)) #define pii pair<int,int>
#define piii pair<pair<int,int>,int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second inline int gc(){
static const int BUF = 1e7;
static char buf[BUF], *bg = buf + BUF, *ed = bg; if(bg == ed) fread(bg = buf, , BUF, stdin);
return *bg++;
} inline int ri(){
int x = , f = , c = gc();
for(; c<||c>; f = c=='-'?-:f, c=gc());
for(; c>&&c<; x = x* + c - , c=gc());
return x*f;
} typedef long long LL;
typedef unsigned long long uLL;
const int inf = 1e9 + ;
const LL mod = 1e9 + ;
const int maxN = 1e5 + ; struct Node{
int value, amount = ; inline bool operator < (const Node &x) const {
return amount < x.amount;
}
}; int n, nlen, ans;
Node nodes[maxN];
unordered_map< int, int > mii;
priority_queue< Node > maxH;
int Ans[maxN][]; int main(){
while(cin >> n) {
mii.clear();
nlen = ;
rep(i, n) {
int t;
scanf("%d", &t);
if(mii.find(t) != mii.end()) {
++nodes[mii[t]].amount;
}
else {
mii[t] = nlen;
nodes[nlen].value = t;
nodes[nlen++].amount = ;
}
} while(!maxH.empty()) maxH.pop();
rep(i, nlen) maxH.push(nodes[i]); ans = ; while(maxH.size() >= ) {
Node a = maxH.top();
maxH.pop();
Node b = maxH.top();
maxH.pop();
Node c = maxH.top();
maxH.pop(); int x = min(min(a.value, b.value), c.value);
int z = max(max(a.value, b.value), c.value);
int y = a.value + b.value + c.value - x - z;
Ans[ans][] = x;
Ans[ans][] = y;
Ans[ans++][] = z; if(--a.amount) maxH.push(a);
if(--b.amount) maxH.push(b);
if(--c.amount) maxH.push(c);
}
cout << ans << endl; rep(i, ans) printf("%d %d %d\n", Ans[i][], Ans[i][], Ans[i][]);
}
return ;
}