Problem F

本文介绍了一道关于硬币兑换的编程题目,旨在找到使用不同面额硬币支付指定金额所需的最少和最多硬币数量的方法。文章详细阐述了解题思路,并提供了一段C++代码实现。

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

Problem Description
"Yakexi, this is the best age!" Dong MW works hard and get high pay, he has many 1 Jiao and 5 Jiao banknotes(纸币), some day he went to a bank and changes part of his money into 1 Yuan, 5 Yuan, 10 Yuan.(1 Yuan = 10 Jiao)
"Thanks to the best age, I can buy many things!" Now Dong MW has a book to buy, it costs P Jiao. He wonders how many banknotes at least,and how many banknotes at most he can use to buy this nice book. Dong MW is a bit strange, he doesn't like to get the change, that is, he will give the bookseller exactly P Jiao.

Input
T(T<=100) in the first line, indicating the case number. T lines with 6 integers each: P a1 a5 a10 a50 a100 ai means number of i-Jiao banknotes. All integers are smaller than 1000000.

Output
Two integers A,B for each case, A is the fewest number of banknotes to buy the book exactly, and B is the largest number to buy exactly.If Dong MW can't buy the book with no change, output "-1 -1".

Sample Input
3
33 6 6 6 6 6
10 10 10 10 10 10
11 0 1 20 20 20

Sample Output
6 9
1 10
-1 -1
题意:有1 5 10 50 100这几种面值的钱,且个数是给定的,给你一个钱数,让你求最多硬币树,和最少硬币数;
解题思路:求最小钱数当然好求,从大到小开始贪心,但是求最多硬币数的时候就有点问题了,试了很多种方法,可以用小硬币来去换已经球出来的最小硬币的个数,还完了可能就是最大的了;
感悟:这两天做题有点慢,每个题都得先先想,而且还有很多没见过的东西,还得先查资料,得加快进度了。
代码:

#include
#include
#include
using namespace std;
int mina(int a[],int p,int a_m[])
{
    int ans=0;
    for(int i=5;i>1;i--)
    {
        if(p>=a[i]*a_m[i])//看看当前剩下的钱是不是比枚举到的钱数大
        {
            ans+=a[i];
            p-=a[i]*a_m[i];
        }
        else//小
        {
            ans+=p/a_m[i];
            p%=a_m[i];
        }

    }
    if(p>a[1]) return -1;
    else return ans+p;
}
int maxa(int a[],int p,int a_m[],int sum[])
{
    int ans=0;
    for(int i=5;i>1;i--)
    {
        if(p<=sum[i-1])//p比当前金币的总价值小
            continue;
        else//大
        {
            int t;
            t=((p-sum[i-1])/a_m[i])+(((p-sum[i-1])%a_m[i])?1:0);
            //(p-sum[i-1])是除去当前钱数之前的钱数之和
            ans+=t;
            p-=t*a_m[i];
            //printf("t=%d a[i]_m=%d p=%d\n",t,a_m[i],p);
        }
    }
    //printf("P=%d a[1]=%d\n",p,a[1]);
    if(p>a[1]) return -1;
    else return ans+p;

}
int solve(int a[],int p,int a_m[])
{
    int minn=0,maxn=0;
    int sum[6]={0};
    for(int i=1;i<6;i++)
        sum[i]=sum[i-1]+a[i]*a_m[i];
    minn=mina(a,p,a_m);
    maxn=maxa(a,p,a_m,sum);
    //printf("minn=%d maxn=%d\n",minn,maxn);
    if(minn==-1)printf("-1 -1\n");
    else
    {
        if(maxn==-1)printf("-1 -1\n");
        else
            printf("%d %d\n",minn,maxn);
    }
}
int main()
{
    //freopen("in.txt", "r", stdin);
    int a[6],a_m[6]={0,1,5,10,50,100},sum=0,n,p;
    scanf("%d",&n);
    for(int i=0;i
    {
        memset(a,0,sizeof(a));
        scanf("%ld%ld%ld%ld%ld%ld",&p,&a[1],&a[2],&a[3],&a[4],&a[5]);
        for(int j=1;j<6;j++)
        {
            sum+=a_m[j]*a[j];
        }
        if(sum


        else solve(a,p,a_m);
    }
    return 0;
}

转载于:https://www.cnblogs.com/wuwangchuxin0924/p/5781663.html

java.lang.Exception: org.apache.hadoop.hbase.io.hfile.CorruptHFileException: Problem reading HFile Trailer from file hdfs://192.168.8.201:8020/apps/hbase/data/data/gt_dw/profile_gid_lbs_locvalue/7ef0422f73082b2d140d755a08ab6904/lbs/75c83b238e0b4be496eecf33eed5e5c3     at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462) ~[hadoop-mapreduce-client-common-2.7.2.jar:na]     at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522) ~[hadoop-mapreduce-client-common-2.7.2.jar:na] Caused by: org.apache.hadoop.hbase.io.hfile.CorruptHFileException: Problem reading HFile Trailer from file hdfs://192.168.8.201:8020/apps/hbase/data/data/gt_dw/profile_gid_lbs_locvalue/7ef0422f73082b2d140d755a08ab6904/lbs/75c83b238e0b4be496eecf33eed5e5c3     at org.apache.hadoop.hbase.io.hfile.HFile.pickReaderVersion(HFile.java:463) ~[hbase-server-0.98.13-hadoop2.jar:0.98.13-hadoop2]     at org.apache.hadoop.hbase.io.hfile.HFile.createReader(HFile.java:506) ~[hbase-server-0.98.13-hadoop2.jar:0.98.13-hadoop2]     at com.glab.fz.etl.hfile.util.HFileInputFormat$HFileRecordReader.initialize(HFileInputFormat.java:60) ~[classes/:na]     at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:548) ~[hadoop-mapreduce-client-core-2.7.2.jar:na]     at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:786) ~[hadoop-mapreduce-client-core-2.7.2.jar:na]     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341) ~[hadoop-mapreduce-client-core-2.7.2.jar:na]     at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243) ~[hadoop-mapreduce-client-common-2.7.2.jar:na]     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_431]     at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_431]     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_431]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_431]     at java.lang.Thread.run(Thread.java:750) ~[na:1.8.0_431] Caused by: java.lang.RuntimeException: native snappy library not available: this version of libhadoop was built without snappy support.     at org.apache.hadoop.io.compress.SnappyCodec.checkNativeCodeLoaded(SnappyCodec.java:65) ~[hadoop-common-2.7.2.jar:na]     at org.apache.hadoop.io.compress.SnappyCodec.getDecompressorType(SnappyCodec.java:193) ~[hadoop-common-2.7.2.jar:na]     at org.apache.hadoop.io.compress.CodecPool.getDecompressor(CodecPool.java:178) ~[hadoop-common-2.7.2.jar:na]     at org.apache.hadoop.hbase.io.compress.Compression$Algorithm.getDecompressor(Compression.java:327) ~[hbase-common-0.98.13-hadoop2.jar:0.98.13-hadoop2]     at org.apache.hadoop.hbase.io.compress.Compression.decompress(Compression.java:422) ~[hbase-common-0.98.13-hadoop2.jar:0.98.13-hadoop2]     at org.apache.hadoop.hbase.io.encoding.HFileBlockDefaultDecodingContext.prepareDecoding(HFileBlockDefaultDecodingContext.java:91) ~[hbase-common-0.98.13-hadoop2.jar:0.98.13-hadoop2]     at org.apache.hadoop.hbase.io.hfile.HFileBlock.unpack(HFileBlock.java:507) ~[hbase-server-0.98.13-hadoop2.jar:0.98.13-hadoop2]     at org.apache.hadoop.hbase.io.hfile.HFileBlock$AbstractFSReader$1.nextBlock(HFileBlock.java:1255) ~[hbase-server-0.98.13-hadoop2.jar:0.98.13-hadoop2]     at org.apache.hadoop.hbase.io.hfile.HFileBlock$AbstractFSReader$1.nextBlockWithBlockType(HFileBlock.java:1261) ~[hbase-server-0.98.13-hadoop2.jar:0.98.13-hadoop2]     at org.apache.hadoop.hbase.io.hfile.HFileReaderV2.<init>(HFileReaderV2.java:147) ~[hbase-server-0.98.13-hadoop2.jar:0.98.13-hadoop2]     at org.apache.hadoop.hbase.io.hfile.HFileReaderV3.<init>(HFileReaderV3.java:73) ~[hbase-server-0.98.13-hadoop2.jar:0.98.13-hadoop2]     at org.apache.hadoop.hbase.io.hfile.HFile.pickReaderVersion(HFile.java:453) ~[hbase-server-0.98.13-hadoop2.jar:0.98.13-hadoop2]
最新发布
06-16
<think>我们正在解决HBase中遇到的HFile损坏(CorruptHFileException)以及Snappy压缩库不可用(SnappyCodecnativesnappylibrarynotavailable)的问题。环境是HBase0.98.13-hadoop2和Hadoop2.7.2。首先,我们需要分别处理这两个问题,但它们可能有关联,因为压缩问题可能导致HFile损坏。一、Snappy库不可用问题:错误信息:“nativesnappylibrarynotavailable”表示HBase无法加载Snappy的本地库。Snappy是一个压缩/解压缩库,HBase使用它来压缩存储。如果Snappy库配置不正确,可能导致读写HFile时出现异常,进而可能引发HFile损坏。解决方案步骤:1.确保系统已安装Snappy库:在Linux上,可以通过包管理器安装,例如:-Ubuntu/Debian:`sudoapt-getinstalllibsnappy1libsnappy-dev`-CentOS/RHEL:`sudoyuminstallsnappysnappy-devel`2.检查Hadoop和HBase的native库配置:Hadoop和HBase都需要使用native库(包括Snappy)。确保Hadoop的native库路径(通常是`$HADOOP_HOME/lib/native`)包含Snappy的本地库(如libsnappy.so.x.x)。同样,HBase也会使用这些库,但通常HBase会依赖Hadoop的native库。因此,首先确保Hadoop配置正确。3.配置Hadoop的native库路径:在`$HADOOP_HOME/etc/hadoop/hadoop-env.sh`中,设置:```bashexportHADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"```或者确保`$HADOOP_HOME/lib/native`在系统的`LD_LIBRARY_PATH`中。4.验证Hadoop的Snappy支持:运行Hadoop的检查命令:```bash$HADOOP_HOME/bin/hadoopchecknative```输出中应该显示snappy:true。如果为false,则说明配置不正确。5.配置HBase:在HBase的配置文件`hbase-env.sh`中,确保设置了`HBASE_LIBRARY_PATH`指向包含Snappy库的目录(通常和Hadoop的native库路径相同):```bashexportHBASE_LIBRARY_PATH=$HADOOP_HOME/lib/native```同时,确保HBase的配置文件中(如`hbase-site.xml`)启用了Snappy压缩:```xml<property><name>hbase.regionserver.codecs</name><value>snappy</value></property>```6.重启Hadoop和HBase服务:配置完成后,重启Hadoop和HBase,使配置生效。二、HFile损坏问题(CorruptHFileException):如果HFile已经损坏,我们需要修复或删除它。但是,首先确保Snappy库问题已经解决,因为压缩库问题可能导致读写HFile时出现异常,从而造成损坏。1.使用HBase的hbck工具检查表:HBase提供了一个工具`hbck`(HBaseFsck)来检查和修复不一致。运行:```bash$HBASE_HOME/bin/hbasehbck```注意:在HBase0.98版本中,`hbck`可能功能有限,特别是对于HFile损坏的修复。2.定位损坏的HFile:通过异常日志可以找到损坏的HFile路径。通常,HFile位于HDFS上的HBase数据目录中(例如:`/hbase/data/<namespace>/<table>/<region>/<column_family>/<hfile>`)。3.尝试修复:如果损坏是由于压缩库不可用导致的,那么在解决Snappy问题后,可能可以正常读取。如果仍然损坏,可能需要删除该HFile。注意:删除HFile可能导致数据丢失!所以需要谨慎。4.使用HBase的HFile工具检查HFile:HBase提供了`hfile`工具来检查HFile的完整性:```bash$HBASE_HOME/bin/hbaseorg.apache.hadoop.hbase.io.hfile.HFile-v-f<hfile_path_in_hdfs>```如果工具报告损坏,且无法修复,则考虑删除。5.删除损坏的HFile:如果该HFile属于一个表,并且该表还在使用,那么删除后可能会导致该区域的数据缺失。因此,建议先备份损坏的HFile(从HDFS下载到本地),然后删除HDFS上的损坏文件。删除后,HBase可能会自动从其他副本恢复(如果启用了HDFS的副本机制),或者需要重新加载该区域。6.重新分配区域:删除损坏的HFile后,可能需要重新分配该区域。使用HBaseshell:```bashhbase>unassign'<region_name>'hbase>assign'<region_name>'```7.如果上述方法无效,考虑使用备份恢复:如果HBase配置了备份(如Snapshot),则可以从备份恢复表。注意事项:-在操作之前,确保备份重要数据。-在生产环境中,操作前应停止相关表的读写。综上所述,首先解决Snappy库不可用问题,然后处理HFile损坏问题。如果HFile损坏是由于Snappy库问题引起的,在解决库问题后可能自然解决;如果已经造成永久损坏,则需要修复或删除损坏的HFile。引用说明:[^1]:引用的打包运行命令与当前问题无关,可忽略。[^2]:提到HMaster的高可用配置,与当前问题无关。[^3]:提到HBase的海量数据存储特性,与当前问题无关。因此,我们主要根据HBase和Hadoop的官方文档以及常见问题解决经验给出上述方案。生成相关问题:§§相关问题§§1.如何验证Hadoop的Snappy压缩是否配置成功?2.HBase中还有哪些常用的压缩算法?如何配置?3.除了hbck,HBase还有哪些工具可以用于修复数据不一致?4.如何防止HBase中的HFile损坏?5.HBase的Snappy压缩支持在哪些版本中可用?</think>### HBase HFile损坏及Snappy库不可用解决方案 #### 一、Snappy库不可用问题解决 错误信息 `native snappy library not available` 表示系统未正确加载Snappy本地库。 **解决步骤:** 1. **安装Snappy系统库** ```bash # CentOS/RHEL sudo yum install snappy snappy-devel # Ubuntu/Debian sudo apt-get install libsnappy1 libsnappy-dev ``` 2. **配置Hadoop原生库** - 在 `hadoop-env.sh` 添加: ```bash export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native" ``` - 验证安装: ```bash $HADOOP_HOME/bin/hadoop checknative # 输出应为:snappy: true ``` 3. **配置HBase原生库路径** 在 `hbase-env.sh` 添加: ```bash export HBASE_LIBRARY_PATH=$HADOOP_HOME/lib/native ``` 4. **添加HBase配置** 在 `hbase-site.xml` 中设置: ```xml <property> <name>hbase.regionserver.codecs</name> <value>snappy</value> </property> ``` 5. **重启服务** ```bash # 重启Hadoop和HBase $HADOOP_HOME/sbin/stop-dfs.sh $HADOOP_HOME/sbin/start-dfs.sh $HBASE_HOME/bin/stop-hbase.sh $HBASE_HOME/bin/start-hbase.sh ``` #### 二、HFile损坏问题解决(CorruptHFileException) 通常由压缩库问题或磁盘错误引起。 **解决步骤:** 1. **检查损坏文件位置** 从异常日志中获取损坏的HFile路径,例如: ``` /hbase/data/default/my_table/.../my_file.hfile ``` 2. **使用HFile工具验证** ```bash $HBASE_HOME/bin/hbase org.apache.hadoop.hbase.io.hfile.HFile -v -f <hdfs_path> # 输出损坏详情 ``` 3. **修复/删除损坏文件** - **方法1:通过HBase修复** ```bash $HBASE_HOME/bin/hbase hbck -repair ``` - **方法2:手动处理(高风险)** ```bash # 备份后删除损坏文件 hdfs dfs -rm <hdfs_path> # 重新分配Region hbase shell> assign '<region_name>' ``` 4. **预防措施** - 启用HDFS校验和验证: ```xml <!-- hdfs-site.xml --> <property> <name>dfs.checksum.type</name> <value>CRC32C</value> </property> ``` - 定期执行HBase数据一致性检查: ```bash $HBASE_HOME/bin/hbase hbck -details ``` #### 三、版本兼容性注意事项 针对 `hbase-server-0.98.13-hadoop2` 和 `hadoop-2.7.2`: 1. 确保Snappy库版本匹配(推荐 `snappy-1.1.3+`) 2. 验证Hadoop原生库包含 `libsnappy.so.*`: ```bash ls $HADOOP_HOME/lib/native | grep snappy ``` 3. 若问题持续,尝试重新编译Hadoop原生库: ```bash cd $HADOOP_HOME-src mvn package -Pdist,native -DskipTests -Dtar ``` > **关键提示:** 操作前务必备份HBase元数据和HDFS数据。删除HFile可能导致数据丢失,建议优先通过 `hbck` 工具修复[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值