Grade HDU5038

本文介绍了一种解决特定蘑菇问题的算法,通过计算不同w值对应的s值出现频率,判断并输出最高频率的s值或者特殊情况下的BadMushroom。算法使用了C++实现,并详细解释了核心思想和步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:
计算每个 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(100w)20w200,观察可知 |100w| 的范围为 [0,100]。 这样我们就只需记录 |100w| 值的出现次数,就可以知道 s 的频率,因为 |100w| 确定了,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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值