UVA - 1591 Data Mining

博客主要介绍了UVA在线判题系统中的一道题目1591,该题目的关键在于理解如何在不重叠存储空间的情况下,找到最小的总存储需求。作者在实现过程中遇到了由于移位运算导致的错误,最初提交的答案被拒绝。通过查阅其他博主的文章,发现问题在于a和b的范围限制(0到31),以及在某些情况下,移位运算可能导致数据类型自动转换为int,从而引发溢出。解决方案是避免使用移位运算,改用幂运算。这个经验提醒我们在编程时要注意数据类型的边界条件和运算符可能导致的隐式类型转换。

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

传送门:UVA-1591

这题理解完感觉没啥难度,公式看来看去都没啥错误,就是在满足 (sp<<a+1)>>b  >= sq的情况下(这是保证存储空间不重叠,因为对q来说相邻两个元素之间的空间就是上式的左边,其实稍微变换一下上式也等价于 (n-1)*(sp<<a+1)>>b+sq>=n*sq,就是总存储空间不小于连续存储空间),求总存储空间的最小值。但是提交总是WA,后来看了这位大佬的博客(https://blog.youkuaiyun.com/a197p/article/details/42322543)才发现a,b的范围是0到31,中间数据用long long 存储,我有的地方图省事乱用移位运算符,左移最多到31位,原本的代码把移位改成pow函数就能过了。

我试了一下,如果用long long定义一个(1<<30)*3,这里30<31,而且整个数据的值也没有超过long long的范围,但是结果是-1073741824,从试验来看似乎如果一个式子里用到了移位,会转化为int型(这里我没找到相关资料,有大佬能解答下吗,这里也看了这位博主的博文https://www.jb51.net/article/85530.htm),总之这种情况以后还是少用移位为好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值