原题:
贝西正在参加一项滑雪比赛。她从起点出发的时候,速度恒定为每秒 1 米。然而,随着比赛进程的增加,她会犯很多错误,每次失误都会使她的速度下降。当她第一次失误后,速度会下降到每秒1/2 米,第二次失误后,速度会下降到每秒 1/3 米,第 k 次失误后,速度会下降到每秒 1/(k + 1) 米。
约翰记录了贝西的所有失误,一共有 N 个。有两种失误,一种发生在比赛开始后的某个时间点,另一种发生在赛道的某个位置上。有时,贝西可能在某个时间点到达某个位置,而恰好在这个时间点和位置上都有一次失误的记录,这两个记录要算作不同的失误,会对贝西的速度造成两次影响。比赛的终点距离起点有 1000 米,请问贝西需要多少时间才能滑过终点?
输入输出格式
输入格式:
第一行:单个整数 N ,1 ≤ N ≤ 10000
第二行到第 N + 1 行:每行开头有个大写字母,代表贝西的一个失误类型:
– 如果是 T,接下来会有一个整数 S,表示在比赛开始后的第 S 秒钟整发生了一次失误,
1 ≤ S ≤ 10^7
– 如果是 D,接下来会有一个整数 X,表示在距离起点 X 米处发生了一次失误,1 ≤ X ≤
1000
输出格式:
单个整数:表示贝西需要多少秒才能滑到终点,如果精确的时间不是整数,则用四舍五入的方
法向最接近的整数取整
输入输出样例
输入样例#1:
2
T 30
D 10
输出样例#1:
2970
说明
前 10 秒,贝西的速度是每秒 1 米,她滑了 10 米。然后她遭遇了第一次失误,在接下来的 20 秒内,她又滑了 10 米。之后她遭遇了第二次失误,还剩下 980 米,所以她共计花去10 + 20 + 2940 = 2970 秒才完成比赛。
题意:
一个人在1000米的雪道上滑雪,在Ti秒和Di位置时,会发生失误,第k次失误会使速度减慢至(1/(k+1))。
问花多少秒到终点?注:若是在Ti秒跑到了Di处,则算做两次不同的失误,速度减慢两次。最终结果四舍五入。
题解:
一道模拟水题,就是没看清最后的四舍五入,害的我改了很久。这道题题目只需要模拟下一次失误是在哪就行。(此代码中,若是在Ti秒滑雪到了Di处则无需考虑,就相当于是多循环了一次)。
附上AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
double d1,d2,v=1.0,cnt=0,dis=0;//d1是Ti秒时走的路程,d2是Di处时走的路程
int n,t[10005],d[10005],cntt=0,cntd=0,err=1;
int main()
{
cin>>n;
char tmp;
int tmpx;
for(int i=1;i<=n;i++)
{
cin>>tmp>>tmpx;
if(tmp=='T')t[++cntt]=tmpx;//区别分配T,D
else d[++cntd]=tmpx;
}
sort(t+1,t+cntt+1);
sort(d+1,d+cntd+1);
t[++cntt]=1e9;
d[++cntd]=1e9;//以免超出某一个任务,另一个始终大一些,则无法输出正确答案
int i=1,j=1;
//cout<<cntt<<" "<<cntd<<endl;测试中间数据
while(i<cntt||j<cntd)
{
v=1.0/err;//要用1.0,否则v会变成0;
d1=dis+(t[i]*1.0-cnt)*v;
d2=d[j];
//cout<<d1<<" "<<d2<<endl;
if(d1<d2)
{
dis=d1;
cnt=t[i];
i++;
}
else
{
cnt+=(d2-dis)/v;
dis=d2;
j++;
}
err++;
//cout<<cnt<<" "<<dis<<" "<<v<<endl;
}
cnt+=(1000-dis)/(1.0/(1.0*err));//剩余的路程直接计算
cout <<(int)(cnt+0.5)<< endl;//四舍五入
return 0;
}
欢迎评论!