讨论 / 这题标准方法是什么?
nie 2011-08-28 17:35:00
点我顶贴 收藏 删除
我用一种白痴的数学方法能过几个。

测试结果1: 测试结果错误.错误结果为:500000000500000

正确结果应为:500000001500000

测试结果2: 测试结果错误.错误结果为:50000000050000000

正确结果应为:49999999950000000

测试结果3: 通过本测试点|有效耗时47ms

测试结果4: 测试结果错误.错误结果为:500000000500

正确结果应为:499999999500

测试结果5: 通过本测试点|有效耗时47ms

测试结果6: 测试结果错误.错误结果为:50000000050000

正确结果应为:49999999950000

测试结果7: 通过本测试点|有效耗时47ms

测试结果8: 通过本测试点|有效耗时47ms

测试结果9: 测试结果错误.错误结果为:50000000050

正确结果应为:50000000150

测试结果10: 测试结果错误.错误结果为:50000000050

正确结果应为:49999999950

提交代码:

01.program p640;

02.const MAX=1000000000;

03.var str:string;

04.i,k:longint;

05.begin

06.readln(str);

07.k:=1;

08.for i:=1 to length(str)-2 do k:=k*10;

09.writeln((MAX+1)*MAX div 2 div k);

10.end.

#1 wtttc@2011-08-28 10:55:00
回复 删除
什么意思

能解释一下你的算法吗?思路

#2 594250@2011-08-28 11:59:00
回复 删除
回复 沙发wtttc 的帖子

求平均数......

#3 nie@2011-08-28 12:15:00
回复 删除
回复 板凳594250 的帖子

不是求平均数,是求近似解。

拿0.05举例,能得到这个结果的范围必定是0.045~0.05444…,范围总共的大小是0.01.

而对于任何一个分母N,分子每次变化(加或者减)的范围是1/N。

0.01/(1/N)就是这个分母所有可行的分子个数(当然有1到2个的出入)。

化简以后就是0.01*N,从1累加到1000000000就是乘法分配律再等差数列求和。

但是因为每个数据都不是精确的,虽然能互相补,但是结果肯定也不精确,尤其是对于分母小的情况。

(为了避免实型,我把0.00…1换成了div 100…0)

我本来以为误差很大的,没想到还对了几个,而且错的几个很有规律。

#4 nie@2011-08-28 12:17:00
回复 删除
求正解

我每次的误差都是10的N次方,这个很神奇,目前还不知道是为什么。

#5 594250@2011-08-28 16:11:00
回复 删除
话说我还没看出错在哪

状态: Unaccepted

测评机: Xeost[5]

得分: 40分

提交日期: 2011-8-28 16:00:00

有效耗时: 187毫秒

测试结果1: 测试结果错误.错误结果为:499999999500000

正确结果应为:500000001500000

测试结果2: 测试结果错误.错误结果为:50000000150000000

正确结果应为:49999999950000000

测试结果3: 通过本测试点|有效耗时47ms

测试结果4: 测试结果错误.错误结果为:500000001500

正确结果应为:499999999500

测试结果5: 通过本测试点|有效耗时47ms

测试结果6: 测试结果错误.错误结果为:50000000150000

正确结果应为:49999999950000

测试结果7: 通过本测试点|有效耗时47ms

测试结果8: 通过本测试点|有效耗时46ms

测试结果9: 测试结果错误.错误结果为:49999999950

正确结果应为:50000000150

测试结果10: 测试结果错误.错误结果为:50000000150

正确结果应为:49999999950

#6 594250@2011-08-28 17:04:00
回复 删除
话说我AC了

我现在发个题解

#7 594250@2011-08-28 17:35:00
回复 删除
想了一下午,好累啊

后面那两道题留给众位大牛了

查看更多回复
提交回复