题意:N个(1<=N<=10^6)蘑菇,每个蘑菇相应的重量wi (0 < wi < 200),每个蘑菇的分数为 s = 10000 - (100 - wi) ^ 2,输出出现频率最大的 s;如果出现频率最大的 s 有多个并且还有其他小的出现频率的分数,则对于出现频率最大的 s,按 s 的大小从小到大依次输出;如果出现频率最大的 s 有多个并且没有其他小的出现频率了,则输出"Bad Mushroom"。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5038
——>>题意晦涩难懂的水模拟。。
#include <cstdio> #include <cmath> #include <algorithm> using std::sort; const int MAXN = 100 + 10; struct GRADE { int grade; int f; bool operator < (const GRADE& e) const { return f > e.f || (f == e.f && grade > e.grade); } } g[MAXN]; int kase; void Init() { for (int i = 0; i <= 99; ++i) { g[i].f = 0; } } void Read() { int N, w, grade; scanf("%d", &N); for (int i = 0; i < N; ++i) { scanf("%d", &w); grade = abs(w - 100); ++g[grade].f; g[grade].grade = grade; } } void Solve() { sort(g, g + 100); printf("Case #%d:\n", ++kase); if (g[0].f > g[1].f) { printf("%d\n", 10000 - g[0].grade * g[0].grade); } else { bool other = false; int i; for (i = 1; i <= 99; ++i) { if (g[i].f > 0 && g[i].f != g[i - 1].f) { other = true; break; } if (g[i].f == 0) break; } if (!other) { puts("Bad Mushroom"); } else { printf("%d", 10000 - g[0].grade * g[0].grade); for (int j = 1; j < i; ++j) { printf(" %d", 10000 - g[j].grade * g[j].grade); } puts(""); } } } int main() { int T; kase = 0; scanf("%d", &T); while (T--) { Init(); Read(); Solve(); } return 0; }