HDU 2527 Safe Or Unsafe(哈夫曼编码)

Safe Or Unsafe

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


Problem Description
Javac++ 一天在看计算机的书籍的时候,看到了一个有趣的东西!每一串字符都可以被编码成一些数字来储存信息,但是不同的编码方式得到的储存空间是不一样的!并且当储存空间大于一定的值的时候是不安全的!所以Javac++ 就想是否有一种方式是可以得到字符编码最小的空间值!显然这是可以的,因为书上有这一块内容--哈夫曼编码(Huffman Coding);一个字母的权值等于该字母在字符串中出现的频率。所以Javac++ 想让你帮忙,给你安全数值和一串字符串,并让你判断这个字符串是否是安全的?
 

Input
输入有多组case,首先是一个数字n表示有n组数据,然后每一组数据是有一个数值m(integer),和一串字符串没有空格只有包含小写字母组成!
 

Output
如果字符串的编码值小于等于给定的值则输出yes,否则输出no。
 

Sample Input
2 12 helloworld 66 ithinkyoucandoit
 

Sample Output
no yes
 
/************************************************************************/

数据结构:哈夫曼树。
这道题考察的是数据结构中的哈夫曼树。
做法:是先根据输入的字符串s确定其叶子节点及其各叶子节点的权值,然后创建哈夫曼树,再根据哈夫曼树求每一个叶子节点的哈夫曼编码。最后根据求得的哈夫曼编码(路径长度)和各叶子节点的权值求的这棵哈夫曼树的带权路径长度(WPL)。
其中创建哈夫曼树和求哈夫曼编码都可以在数据结构的书上找到模板,你需要做的就是根据s确定叶子节点和权值以及求WPL(WPL即为最后要比较的值)。
需要注意的是,当s只有一种字符的情况下,哈夫曼树是构造不起来的,需要特殊处理(直接比较)。一开始没有注意这个细节,提交了的结果是WA,后来看了Discuss才知道。

这是我第一次做哈夫曼编码的题,自己尝试模板什么的都不看,写出来的成果,虽然不知道写得好不好,但是至少能过了此题

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<stdlib.h>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#define exp 1e-10
using namespace std;
const int N = 10005;
const int inf = 1000000000;
const int mod = 2009;
int w[26];
struct node
{
    int k,sum;
    char ch[30];
    node(){}
    node(int k0,int sum0,char ch0)
    {
        sum=sum0;k=k0;
        ch[0]=ch0;
    }
    node(int k1,int k2,int sum0,char *t1,char *t2)
    {
        sum=sum0;k=k1+k2;
        for(int i=0;i<k1;i++)
            ch[i]=t1[i],w[t1[i]-'a']++;
        for(int i=0;i<k2;i++)
            ch[i+k1]=t2[i],w[t2[i]-'a']++;
    }
    bool operator < (const node &a) const
    {
       return sum>a.sum;//最小值优先
    }
};
char s[N];
int main()
{
    int t,n,i,sum;
    scanf("%d",&t);
    while(t--)
    {
        priority_queue<node> q;
        memset(w,0,sizeof(w));
        scanf("%d",&n);
        scanf("%s",s);
        for(i=0;s[i]!='\0';i++)
            w[s[i]-'a']++;
        for(i=0;i<26;i++)
            if(w[i])
                q.push(node(1,w[i],i+'a'));
        memset(w,0,sizeof(w));
        if(q.size()==1)
        {
            if(strlen(s)>n)
                puts("no");
            else
                puts("yes");
            continue;
        }
        while(q.size()>1)
        {
            node u1=q.top();
            q.pop();
            node u2=q.top();
            q.pop();
            q.push(node(u1.k,u2.k,u1.sum+u2.sum,u1.ch,u2.ch));
        }
        node u=q.top();
        q.pop();
        for(i=sum=0;s[i]!='\0';i++)
            sum+=w[s[i]-'a'];
        if(sum>n)
            puts("no");
        else
            puts("yes");
    }
	return 0;
}
菜鸟成长记
该数据集通过合成方式模拟了多种发动机在运行过程中的传感器监测数据,旨在构建一个用于机械系统故障检测的基准资源,特别适用于汽车领域的诊断分析。数据按固定时间间隔采集,涵盖了发动机性能指标、异常状态以及工作模式等多维度信息。 时间戳:数据类型为日期时间,记录了每个数据点的采集时刻。序列起始于2024年12月24日10:00,并以5分钟为间隔持续生成,体现了对发动机运行状态的连续监测。 温度(摄氏度):以浮点数形式记录发动机的温度读数。其数值范围通常处于60至120摄氏度之间,反映了发动机在常规工况下的典型温度区间。 转速(转/分钟):以浮点数表示发动机曲轴的旋转速度。该参数在1000至4000转/分钟的范围内随机生成,符合多数发动机在正常运转时的转速特征。 燃油效率(公里/升):浮点型变量,用于衡量发动机的燃料利用效能,即每升燃料所能支持的行驶里程。其取值范围设定在15至30公里/升之间。 振动_X、振动_Y、振动_Z:这三个浮点数列分别记录了发动机在三维空间坐标系中各轴向的振动强度。测量值标准化至0到1的标度,较高的数值通常暗示存在异常振动,可能与潜在的机械故障相关。 扭矩(牛·米):以浮点数表征发动机输出的旋转力矩,数值区间为50至200牛·米,体现了发动机的负载能力。 功率输出(千瓦):浮点型变量,描述发动机单位时间内做功的速率,取值范围为20至100千瓦。 故障状态:整型分类变量,用于标识发动机的异常程度,共分为四个等级:0代表正常状态,1表示轻微故障,2对应中等故障,3指示严重故障。该列作为分类任务的目标变量,支持基于传感器数据预测故障等级。 运行模式:字符串类型变量,描述发动机当前的工作状态,主要包括:怠速(发动机运转但无负载)、巡航(发动机在常规负载下平稳运行)、重载(发动机承受高负荷或高压工况)。 数据集整体包含1000条记录,每条记录对应特定时刻的发动机性能快照。其中故障状态涵盖从正常到严重故障的四级分类,有助于训练模型实现故障预测与诊断。所有数据均为合成生成,旨在模拟真实的发动机性能变化与典型故障场景,所包含的温度、转速、燃油效率、振动、扭矩及功率输出等关键传感指标,均为影响发动机故障判定的重要因素。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值