Codeforces 237 div2 B. Marathon(关于精度损失的教训)
2014-03-20 14:26
375 查看
题目链接:http://codeforces.com/contest/404/problem/B?csrf_token=6292hf3e1h4g5e0d16a996ge6bgcg7g2
解题报告:一个正方形的跑道,边长是a,然后教练给运动员一个规定,每跑d米就额外补充一次饮料,然后输入一个n,表示一共将补充n次,比赛的出发点是(0,0),
也就是左下角的那个点,然后让你求出每次补充饮料的坐标。
本来看起来应该挺简单的一个模拟题,结果没想到一波三折,哎,技术问题啊。首先要注意的就是它规定的是精确到小数点后的四位,所以我在处理的时候,先把输入
全部乘以10000然后转化成整数来处理,这样就可以把小数点后四位以下都忽略掉,然后在输出的时候再转化一下就可以了,这样的想法是对的,但是我首先就犯了一个错误就是这题本来规定的数据范围是10^5,但是我做了乘10000处理,所以数据范围就到了10^9级别,所以int显然是不够的,一开始是这样错的,然后发现了又改过来了,
但是没想到改过来了还是错的,没办法,只好去看测试数据了,结果发现我的第7组测试数据的第6个数比正确的结果大了1,然后果断把那组数据在我本地测试了一下,
结果很纠结,97591.0354 一转化,就像见鬼了一样,转化整数后就成了975910353,怪不得会有个1的差距了,然后我左改又改,就像见鬼了一样,就是有个1的损失,
这时候我才意识到精度损失了,可是怎么解决呢,想起来以前用过一种+0.000001来防止精度损失的办法,果然改过之后就AC 了,哎,虽然这题没A ,但通过这次的教训,我希望可以记住下次碰到这种精度要求较高的题时切记要注意精度的问题了。哦,对了,还有一个,CF规定一定要用__int64,不能出现long long 以及类似的类型。
View Code
解题报告:一个正方形的跑道,边长是a,然后教练给运动员一个规定,每跑d米就额外补充一次饮料,然后输入一个n,表示一共将补充n次,比赛的出发点是(0,0),
也就是左下角的那个点,然后让你求出每次补充饮料的坐标。
本来看起来应该挺简单的一个模拟题,结果没想到一波三折,哎,技术问题啊。首先要注意的就是它规定的是精确到小数点后的四位,所以我在处理的时候,先把输入
全部乘以10000然后转化成整数来处理,这样就可以把小数点后四位以下都忽略掉,然后在输出的时候再转化一下就可以了,这样的想法是对的,但是我首先就犯了一个错误就是这题本来规定的数据范围是10^5,但是我做了乘10000处理,所以数据范围就到了10^9级别,所以int显然是不够的,一开始是这样错的,然后发现了又改过来了,
但是没想到改过来了还是错的,没办法,只好去看测试数据了,结果发现我的第7组测试数据的第6个数比正确的结果大了1,然后果断把那组数据在我本地测试了一下,
结果很纠结,97591.0354 一转化,就像见鬼了一样,转化整数后就成了975910353,怪不得会有个1的差距了,然后我左改又改,就像见鬼了一样,就是有个1的损失,
这时候我才意识到精度损失了,可是怎么解决呢,想起来以前用过一种+0.000001来防止精度损失的办法,果然改过之后就AC 了,哎,虽然这题没A ,但通过这次的教训,我希望可以记住下次碰到这种精度要求较高的题时切记要注意精度的问题了。哦,对了,还有一个,CF规定一定要用__int64,不能出现long long 以及类似的类型。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef __int64 INT; int main() { double c,e; INT n; while(scanf("%lf%lf",&c,&e)!=EOF) { scanf("%I64d",&n); c *= 10000.0; e *= 10000.0; c += 0.000001; e += 0.000001; INT a = (INT)c; INT d = (INT)e; for(int i = 1;i <= n;++i) { INT race = i * d; race %= (4*a); double x,y; if(race >= 0 && race <= a) { x = (double)race / 10000.0; y = 0; } else if(race > a && race <= 2*a) { race -= a; x = (double)a / 10000.0; y = (double)race / 10000.0; } else if(race > 2*a && race <= 3*a) { race -= (2*a); race = a - race; x = (double)race / 10000.0; y = (double)a / 10000.0; } else if(race > 3*a && race <4*a) { race -= (3*a); race = a - race; x = 0; y = (double)race / 10000.0; } printf("%.10lf %.10lf\n",x,y); } } return 0; }
View Code
相关文章推荐
- 关于BigDecimal比较的精度损失问题
- Codeforces Round #237 (Div. 2) 404B Marathon【精度】 好题!!!!
- Java中关于 BigDecimal 的double入参的构造函数导致的数据似乎损失精度的bug
- 玉伯的一道课后题题解(关于 IEEE 754 双精度浮点型精度损失)
- 关于c中 int, float, double转换中存在的精度损失问题
- Java中关于 BigDecimal 的一个导致double精度损失的"bug"
- Codeforces Round #237 (Div. 2) B. Marathon(模拟题)(待看。。。)
- codeforces基础题——#361(div2)D
- Codeforces Round #118 (Div. 2) B题(Codeforces上不支持qsort,只支持sort!!!)
- 关于GetTickCount和QueryPerformanceCounter的精度区别
- Codeforces Beta Round #29 (Div. 2, Codeforces format), problem: (C) Mail Stamps 图论
- Codeforces #211 (Div. 2) A. Soroban
- Codeforces_Round_#241_DIV2_ABC
- 关于java中Double类型的运算精度问题
- codeforces基础题——#358(div2)D
- codeforces水题100道 第十六题 Codeforces Round #164 (Div. 2) A. Games (brute force)
- 关于div行高的巨细问题(如何设置 div 的最小高度)
- Codeforces 200 div1 C. Read Time
- codeforces 260 div2 C题
- [Codeforces]Educational Codeforces Round 37 (Rated for Div. 2)