S2_I_Marathon

本文介绍了一种算法,用于计算马拉松运动员在正方形赛道上跑步时,每隔一定距离的精确坐标位置。该算法考虑了精度问题,并提供了详细的解决方案和代码示例。

Marathon

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

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 lower left corner is located at point with coordinates (0, 0) and the length of the side equals a meters. The sides of the square are parallel to coordinate axes.

As the length of the marathon race is very long, Valera needs to have extra drink during the race. The coach gives Valera a bottle of drink each d meters of the path. We know that Valera starts at the point with coordinates (0, 0) and runs counter-clockwise. That is, when Valera covers a meters, he reaches the point with coordinates (a, 0). We also know that the length of the marathon race equals nd + 0.5 meters.

Help Valera’s coach determine where he should be located to help Valera. Specifically, determine the coordinates of Valera’s positions when he covers d, 2·d, …, n·d meters.

Input

The first line contains two space-separated real numbers a and d (1 ≤ a, d ≤ 105), given with precision till 4 decimal digits after the decimal point. Number a denotes the length of the square’s side that describes the stadium. Number d shows that after each d meters Valera gets an extra drink.

The second line contains integer n (1 ≤ n ≤ 105) showing that Valera needs an extra drink n times.

Output

Print n lines, each line should contain two real numbers x**i and y**i, separated by a space. Numbers x**i and y**i in the i-th line mean that Valera is at point with coordinates (x**i, y**i) after he covers i·d meters. Your solution will be considered correct if the absolute or relative error doesn’t exceed 10 - 4.

Note, that this problem have huge amount of output data. Please, do not use cout stream for output in this problem.

Examples

input

Copy

2 5
2

output

Copy

1.0000000000 2.0000000000
2.0000000000 0.0000000000

input

Copy

4.147 2.8819
6

output

Copy

2.8819000000 0.0000000000
4.1470000000 1.6168000000
3.7953000000 4.1470000000
0.9134000000 4.1470000000
0.0000000000 2.1785000000
0.7034000000 0.0000000000

题目大意

有一个正方形的运动场,边长为a,一个人从原点开始,逆时针跑。求出每次跑d米的坐标。

题目分析

其实是一道很简单的水题……然后很神经质的卡在了这里。主要是精度的问题吧。不过还是基础不是很扎实,卡在了几个奇奇怪怪的地方。

先说说自己踩了什么坑吧。

首先double输入的确是用的是"%lf",而输出用的是"%f"。这个是没问题的。

错是错在了输出的0的时候,用%lf输出0是不对的,要填0.0(直接在双引号里面打0不就好了)……在这里wa了几发了,超级傻逼。

再然后,浮点数取模,emmm虽然时候听大佬们说有fmod这种东西,可是为什么我事后用fmod还是过不了……

我是直接实现了一个。

long long k = (double) i * d / a;
double t = (double) i * d - k * a;

t就是余数。还有就是这道题n,d的范围是1e5。相乘就是1e10,int就爆了,卡了这一手我心态爆炸。

所以下面是水水的题目分析。

对于每一倍的d,都对a做除法与取模,然后模数对应一下几种情况:

if(k == 0)
    printf("%f %f\n", t, 0.0);
else if(k == 1)
    printf("%f %f\n", a, t);
else if(k == 2)
    printf("%f %f\n", a - t, a);
else if(k == 3)
    printf("%f %f\n", 0.0, a - t);

代码

#include <cstdio>
using namespace std;
int main(int argc, char const *argv[]) {
  double a, d;
  int n;
  scanf("%lf%lf%d", &a, &d, &n);
  for(int i = 1; i <= n; i++){
    long long k = (double) i * d / a;
    double t = (double) i * d - k * a;
    k %= 4;
    if(k == 0)
      printf("%f %f\n", t, 0.0);
    else if(k == 1)
      printf("%f %f\n", a, t);
    else if(k == 2)
      printf("%f %f\n", a - t, a);
    else if(k == 3)
      printf("%f %f\n", 0.0, a - t);
  }
  return 0;
}
### 合并马拉松结果文件并分析选手疲惫状态 #### 数据合并 为了将名为 `marathon_results_2015`、`marathon_results_2016` 和 `marathon_results_2017` 的三个文件合并为一个文件,可以使用 Python 的 `pandas` 库。以下代码示例展示了如何实现这一目标: ```python import pandas as pd # 读取三个文件 df_2015 = pd.read_csv('marathon_results_2015.csv') df_2016 = pd.read_csv('marathon_results_2016.csv') df_2017 = pd.read_csv('marathon_results_2017.csv') # 合并数据 combined_df = pd.concat([df_2015, df_2016, df_2017], ignore_index=True) # 保存合并后的文件 combined_df.to_csv('combined_marathon_results.csv', index=False) ``` 上述代码通过 `pd.concat` 方法将三个数据框合并,并使用 `ignore_index=True` 参数确保索引重新排列[^1]。 #### 分析选手疲惫状态 在分析选手是否进入疲惫状态时,可以通过比较不同阶段的速度变化来判断。以下是具体实现方法: 1. **计算每阶段速度**:根据给定的距离(如 5K、10K 等)和对应时间,计算每个阶段的平均速度。 2. **定义疲惫阈值**:设定一个速度下降百分比作为疲惫阈值(例如 10%)。如果某阶段的速度下降超过该阈值,则认为选手进入疲惫状态。 3. **检测疲惫状态**:通过计算相邻阶段的速度变化率,识别速度显著下降的阶段。 以下是实现上述逻辑的代码: ```python def calculate_speed(row, distance_col, time_col): """ 计算每公里平均速度 (m/s) """ distance = row[distance_col] * 1000 # 转换为米 time_seconds = row[time_col].total_seconds() # 转换为秒 return distance / time_seconds if time_seconds > 0 else 0 def detect_fatigue(data, fatigue_threshold=0.1): """ 检测选手是否进入疲惫状态 """ stages = ['5K', '10K', '15K', '20K', 'Half', '25K', '30K', '35K', '40K'] # 初始化速度列 for stage in stages: data[f'Speed_{stage}'] = None # 计算每个阶段的速度 for stage in stages: time_col = f'{stage} Time' if time_col in data.columns: data[f'Speed_{stage}'] = data.apply( lambda row: calculate_speed(row, float(stage[:-1]), row[time_col]), axis=1 ) # 初始化疲惫状态列 data['Fatigue'] = False # 检测速度下降是否超过阈值 for i in range(1, len(stages)): prev_stage = stages[i - 1] curr_stage = stages[i] prev_speed_col = f'Speed_{prev_stage}' curr_speed_col = f'Speed_{curr_stage}' if prev_speed_col in data.columns and curr_speed_col in data.columns: speed_change_rate = (data[prev_speed_col] - data[curr_speed_col]) / data[prev_speed_col] data.loc[speed_change_rate > fatigue_threshold, 'Fatigue'] = True return data # 应用疲惫状态检测 result_df = detect_fatigue(combined_df) result_df.to_csv('combined_marathon_results_with_fatigue.csv', index=False) ``` #### 参考文献 - 运动科学领域中,速度变化率常被用作评估运动员疲劳程度的指标[^2]。 - 马拉松数据分析的相关研究也表明,后期阶段速度的显著下降与选手的疲惫状态密切相关[^3]。 #### 注意事项 - 数据质量对结果的影响较大,确保输入的时间数据准确无误。 - 疲惫阈值的选择应根据具体比赛环境和选手水平进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值