HDOJ笔记

17 篇文章 0 订阅
10 篇文章 0 订阅

ID 1000:

  学会使用scanf,注意scanf将忽略所有空白字符(空格、回车符、制表符)。

ID 1001:

  防止运算过程中,数据溢出,该问题描述中注明了结果在32位有符号整数范围内,自己写算法时会发现中间过程会存在数据溢出,需根据中间范围上界(32位无符号整数可以),考虑使用强制类型转换(unsigned)。

  关键知识点:考虑数据大小,防止程序计算发生溢出现象。

ID 1002:

思路:

   描述中1个整数长度不会超过1000,且为正整数。

   开始时使用系统最高有效位 unsigned long long (FAQ里使用 %I64u gcc编译会弹出warning,改: %Illu),仍然不通过测试,猜测数据溢出。

   严格按照题目要求,使用字符串保存正整数(因为正整数长度不超过1000,任何一种数据类型都无法存储),然后求和。(根据加法按位求和公式)。

技巧:

gcc 加入 -Wall参数检测warning

关键知识点:字符串处理。

ID 1003:

注意:题目中返回索引时使用的初始值(0还是1?)

关键知识点:最长子数组和;动态规划。 参考《编程之美》

速度优化:扫描一个数组元素值就抛弃一个,避免开辟大空间存储数组。

做题情况:Wrong answer

 没注意题目中要求 1 <= N ,求改assert判断阈值;

 单个负数时出错,原因时sum_right < 0 时,index_begin存储的是下一次的正确数据,而下一次不一定存在,因此添加一个临时变量,解决问题。(测试数组:-6 1;6 -1;)

ID 1004:

关键知识点:字符串匹配;相同字符串个数统计。

思路:采用表记录字符串并统计相同字符串个数,为了避免同步解决多个问题时字符串相同是多COPY添加记录,采用大表记录所有字符串。

分析:使用大表统计,适用于多个问题字符串大部分相同情况,若不同问题中字符串相同的字符串个数较少,适宜使用小表。

做题情况:一次通过。

ID 1005:

关键知识点:动态规划(类似Fib函数)-> 数学规律求解(重复序列)

做题情况:Time Limit Exceeded

 原因:时间复杂度O(n),每步涉及两个乘法运算;

 解决:观察序列变换情况,采用数学规律法求解,观察可以发现不同输入,总会在某种长度值下重复原来的求解,(原因:求余算法,模为7)。我们的目标是找到这个长度值。

 接着分析,从数据上来看连续两个数1,1总可以作为分界线,因为这正是初始两个值,1,1后将会不断重复原来结果。可以判断最长重复长度为7 * 7 = 49,记录这些重复数据及可快速求解。(与Fib函数区别:数据会重复出现)时间复杂度降为O(1) (n远大于49时)

做题情况:Runtime Error
(ACCESS_VIOLATION)

初步判断数组访问越界:解决:n <= 50时输出结果,n > 50时寻找,第二次出现连续1,1的位置,记录长度。

其他错误情况:注意边界情况。

ID 1008:

简单题

陷阱(正确分析问题):明确input的各个数据的含义,特别是开通数字很可能是个数说明(特殊数据)而不是普通数据。

做题情况:一次通过。

ID 1007:

思路:

首先分析一维情况下:可以对数组排序,找相邻两点的距离最小值,即可通过此值作为ring最大值,保证ring不会“圈”住两个以上玩具。

接者分析二维情况:目标是找到平面上距离最小的两点,这两点距离的1 / 2,即是所求ring圆圈的半径,以这两点距离为中心,它为最大半径画圆,将保证ring不会“圈”住两个以上玩具。

关键知识点:本质上与《编程之美》题目2.11寻找最近点对相同。考察分治算法。

解决想法一:二维情况下无法排序,可以枚举任意两点之间距离,找到最小距离值(暴力求解法)。(时间复杂度O(n^2),每步涉及两个乘法运算(距离公式,可以不必每步都开根号)。

解决想法二:寻找的是平面上最近两点的距离,采用分治思想。(《算法导论》)

做题情况:

采用暴力求解法,给出Time Limit Exceeded。不使用暴力算法。

采用分治思想:给出Wrong Answer。

问题:中位数求取后merge时左右扫描方式不对,发现,并没有搜索靠近中位数旁边两个点之间的距离,少了这个距离可能会导致程序出错,例子如下:

0 -1.00 0.00
1 5.00 0.00
2 6.00 10.00
3 7.00 0.00
4 12.00 0.00

仍然报Wrong answer:后面把精度从float提高到double型后终于做对!!!!以后浮点型采用double处理!!!!!另外就是浮点型比较大小用0.00001,不能转成int。

ID 1009:

关键知识点:考察贪心算法。(《算法导论》)

补充:1.结构体存储数据方便排序等算法。2.精度采用DBL_EPSILON 宏定义,不采用0.00001。

ID 1012:

关键知识点:精度问题。(乘10倍数 / %.9lf)

补充:这里只输出特定数据,并没有输入,考虑算法速度的话可以直接外部测试得到结果,最后main函数直接打印,还可以提交测试结果是否正确。

double精度只保留其位小数,与要求输出的精度不符合,可以乘以个10的倍数1000,保证关键的后9位(精度要求)不会丢失。剩下就想办法输出正确数字了。如果乘以10^9,那么正确值都将保留在整数部分,接下来只要打印输出即可。

优化:发现%lf虽然只显示7位,实际上计算机精度是够的,输出改为%.9lf即可获得题目要求精度的结果。

ID 1013:

算法比较简单,考虑边读取字符数据边处理数据加快运行速度,而不保留全部数据(减少内存开辟)。

做题情况:Compilation Error

问题:字符转成数字(0-9)后不能和EOF等比较,要注意对应类型。

仍然报错,查看FAQ后发现HDOJ可以该点击结果查看错误情况:(可以发现可能是注释不能放在单行的缘故)
0_0_13182780_2436.c: In function 'main':
0_0_13182780_2436.c:6:5: error: expected expression before '/' token
// read as char

Wrong answer

原因:未正确理解题意,虽然考虑到整数很大,但根据题意不能做到边扫描边处理,仍需要开辟一定缓存处理数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值