题意:
计算每个 w 的 s,遇到所有 s 的频率相同时(除了所有的 s 也相同的情况)输出 Bad Mushroom,否则输出最高频率的 s 值。
举例:
1. 1,1,1,2,2,2,输出 Bad Mushroom,原因是 1 和 2 的频率相同,没有其他的 s 频率不同。
2. 1,1,2,2,2,2,输出 2,原因是 2 的频率最大,1 的频率比 2 小。
3. 1,1,1,2,2,2,3,输出1,2,原因是 1 和 2 的频率最大,此外 3 的频率要比它们小。
4. 1,1,1,1,1,1,输出 1,原因是虽然所有 s 的频率相同,但所有 s 相同,都为 1。
思路:
因为 s=10000−(100−w)2,0≤w≤200,观察可知 |100−w| 的范围为 [0,100]。 这样我们就只需记录 |100−w| 值的出现次数,就可以知道 s 的频率,因为 |100−w| 确定了,s 就确定了。剩下的就是判断查找输出了。
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<stack>
#include<queue>
#include<utility>
#include<vector>
#include<cmath>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1000010;
int N;
int m[110]; //m数组用来存|100-w|的出现次数
int main()
{
//freopen("in.txt", "r", stdin);
int t;
scanf("%d", &t);
int kase = 1;
while(t--){
scanf("%d", &N);
memset(m, 0, sizeof(m));
int number = 0; //number用来记录不同的 s 的个数
for(int i=0; i<N; i++){
int x;
scanf("%d", &x);
if(m[abs(x-100)] == 0) number++;
m[abs(x-100)]++;
}
//判断所有的 s 值是否相同
bool issame = true;
int tmp = -1;
for(int i=0; i<=100; i++){
if(m[i] == 0) continue;
if(tmp == -1){
tmp = m[i];
continue;
}
if(tmp != m[i]){
issame = false;
break;
}
}
printf("Case #%d:\n", kase++);
if(issame && number!=1){ //如果所有的 s 值频率相同但值不相同
printf("Bad Mushroom\n");
}
else{
//找到最大频率的 s 值
int maxx = -1;
for(int i=0; i<=100; i++){
if(m[i] == 0) continue;
if(maxx < m[i]) maxx = m[i];
}
//输出结果
bool first = true;
for(int i=100; i>=0; i--){
if(m[i] == 0) continue;
if(m[i] == maxx && first){
printf("%d", 10000-i*i);
first = false;
}
else if(m[i] == maxx)
printf(" %d", 10000-i*i);
}
printf("\n");
}
}
return 0;
}