CodeForces - 404B Marathon(精度)

题意:一个人绕着一个长度为a的正方形逆时针跑,以(0,0)为起点,喝一次水可以跑d米,问每喝一次水可以跑到的位置坐标。

分析:这道题卡精度卡的太厉害了。

设l是正方形的周长,只有d对l取余且每次跑d米都对l取余,并用取余后的结果继续跑,这样的精度才够。

1、double a = fmod(x, y);返回的是浮点数x对浮点数y取余后的结果。

2、每跑d米,通过对l取余得到当前位置与起点的路径长,从而确定当前位置的坐标。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define lowbit(x) (x & (-x))
const double eps = 1e-12;
inline int dcmp(double a, double b){
    if(fabs(a - b) < eps) return 0;
    return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 10000 + 10;
const int MAXT = 10000 + 10;
using namespace std;
int main(){
    double a, d;
    int n;
    scanf("%lf%lf%d", &a, &d, &n);
    double sum = 0;
    double l = 4 * a;
    d = fmod(d, 4 * a);
    while(n--){
        sum += d;
        sum = fmod(sum, l);
        double tmp = fmod(sum, a);
        if(dcmp(sum, a) < 0){
            printf("%.10f 0.0000000000\n", tmp);
        }
        else if(dcmp(sum, 2 * a) < 0){
            tmp = fmod(tmp, a);
            printf("%.10f %.10f\n", a, tmp);
        }
        else if(dcmp(sum, 3 * a) < 0){
            tmp = fmod(tmp, a);
            printf("%.10f %.10f\n", a - tmp, a);
        }
        else{
            tmp = fmod(tmp, a);
            printf("0.0000000000 %.10f\n", a - tmp);
        }
    }
    return 0;
}

  

时间: 2024-12-25 14:40:06

CodeForces - 404B Marathon(精度)的相关文章

CodeForces 404B 手速题

//CodeForces 404B 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "algorithm" 5 using namespace std; 6 const __int64 N = 1e6; 7 double a, d; 8 int n; 9 10 int main() 11 { 12 int i; 13 scanf

CodeForces - 404B(模拟题)

Marathon Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status Description Valera takes part in the Berland Marathon. The marathon race starts at the stadium that can be represented on the plane as a square whose

codeforces 404 B Marathon【fmod对浮点数取余】

题意:给出一个边长为a的正方形,给出d,给出n,输出走得距离为i个d的时候的坐标 学习的这一篇 http://blog.csdn.net/synapse7/article/details/21595639 用fmod可以对浮点数取余 然后当d很大的时候,做除法容易产生较大的误差,所以先用fmod(d,4*a)处理一下(事实证明不处理,会wa在11个数据) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring>

codeforces 560 C Gerald&#39;s Hexagon

神精度--------这都能过,随便算就好了,根本不用担心 就是把六边形补全成三角形,然后去掉补的三个三角形,然后面积除以边长1的三角形的面积即可.... #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector&

【codeforces 623E】 Transforming Sequence

http://codeforces.com/problemset/problem/623/E (题目链接) 题意 长度为${n}$的满足前缀按位或为单调递增的${k}$位序列.要求每个位置为${[1,2^k-1]}$之间的整数,求方案数. Solution 毛爷爷论文题,然而论文上的${dp}$方程都是错的,坑爹啊!! 首先,每个数的二进制位上一定存在一位为${1}$,且之前的数的这一位上都为${0}$,这样才能保证按位或的前缀和单调递增.那么当${n>k}$时,显然答案是等于${0}$的,所以

codeforces 600D Area of Two Circles&#39; Intersection

分相离,内含,想交三种情况讨论一下. 主要是精度和数据范围的问题,首先数据用long double,能用整型判断就不要用浮点型. 题目中所给的坐标,半径是整型的,出现卡浮点判断的情况还是比较少的. 最后算三角型面积的时候不要用海伦公式,有四个连乘很容易爆数据范围损失精度,即使拆开两两乘也要考虑符号 (取对数也是比较好的办法).(不知道sqrt和cos,sin的精度如何比较 #include<bits/stdc++.h> using namespace std; typedef long dou

Codeforces 700A As Fast As Possible(二分答案)

[题目链接] http://codeforces.com/problemset/problem/700/A [题目大意] 有一辆限载k人速度为v2的车,n个步行速度均为v1的人要通过一段长度为l的距离,每个人只能上车一次,车可以来回走,问所有人到达目的地所需要的最短时间是多少 [题解] 因为车可以载k个人,所以,我们把人k个为一组分成(n+k-1)/k组,记为p吗,设需要的最短时间为t,每个人在车上待的时间为t2,那么可以列方程v1*(t-t2)+v2*t2=l,我们可以发现t2可以用t来表示,

codeforces 514B. Han Solo and Lazer Gun 解题报告

题目链接:http://codeforces.com/problemset/problem/514/B 题目意思:给出双头枪的位置(x0, y0),以及 n 个突击队成员的坐标.双头枪射击一次,可以把它对住的方向(是直线,不是射线,因为是双头嘛)所有的人射杀掉.问将所有突击队成员消灭的最少射击数是多少. 首先要清楚的是,双头枪可以瞄准的方向是无限的,所以通过枚举所有方向是不现实的!方向其实就是对应斜率,但是没有理由把函数求出然后将士兵的位置一个一个代入来做吧---所以呢,直接求 k 就可以了,k

CodeForces 801C 二分,浮点数

CodeForces 801C 题意: n个设备,第 i个设备每秒用电a[i],原本储存电量b[i].只有一个充电器,每秒可给一个设备充电 p.所有的设备要同时工作,问最多可以工作多长时间? tags:就是二分,但写挂了好多发.. 坑点: 1.右边界会爆1e9 ... 2.担心 double 会丢失精度,用了 long double. 然后long double ,头文件 #include <iomanip.h> .一开始用 printf("%.6Lf\n", r)输出,在