试题描述 |
今天,czy开着挖掘机去上学(……)。但是他发现他的mz满天下,所以一路上他碰到了好多他的mz。一开始他以1km/min的速度(=60km/h……)开着挖掘机前进。 他发现他只会在恰好到达某一时刻或者到达某个距离遇到mz。每次遇到mz,czy都会毫不犹豫的把她们顺路捎走(^_^)。但是他实在是太虚了,以至于当有i个mz时他的速度下降到1/(i+1)。具体说,一开始czy以1km/min速度前进,有1个mz的时候速度变为1/2 km/min,有2个mz时变为1/3 km/min……以此类推。现在问题来了,给出每个mz在何时出现,请你算出czy到学校要多久。 |
输入格式 |
输入第一行2个数n,m,分别表示mz数和czy与学校的距离(km) 接下来2到n+1行由字符串与数字构成 Dist x表示在距离达到x km时出现一个mz Time x表示在时间达到x min时出现一个mz |
输出格式 |
输出一个整数,表示到达学校的时间。如果不能整除,直接输出整数部分即可。 |
输入示例 |
2 20 Time 3 Dist 10 |
输出示例 |
47 |
注释说明 |
对于30%数据,n,m<=50 对于50%数据,n,m<=2000 对于100%数据,n,m<=200000,x<=10^9,保证输入的数字都是整数 |
【分析】
模拟,分别存储按时间出现和按路程出现的妹子,每次比较时间,注意判断边界。
时间一急写得就很乱,反正也没人会看啦~
【代码】
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n, m, di[200020], ti[200000], d, t, x, dv; 5 double vn, xn, tn; 6 char s[5]; 7 8 void init() { 9 cin >> n >> m; 10 for (int i=1;i<=n;++i) { 11 scanf("%s", s); 12 scanf("%d", &x); 13 if (s[0]==‘D‘) { 14 di[0]++; 15 di[di[0]]=x; 16 } 17 else { 18 ti[0]++; 19 ti[ti[0]]=x; 20 } 21 } 22 sort(di+1, di+di[0]+1); 23 sort(ti+1, ti+ti[0]+1); 24 } 25 26 void sovle() { 27 d=t=vn=1, xn=tn=0, dv=2; 28 for (int i=1;i<=di[0]+ti[0];++i) { 29 if (di[d] >= m) { 30 d++; 31 continue; 32 } 33 if (xn+(ti[t]-tn)*vn >= m) { 34 t++; 35 continue; 36 } 37 if (t==ti[0]+1 && d!=di[0]+1) { 38 tn+=double(di[d]-xn)/vn, xn=double(di[d]), vn=(1/double(dv)), dv++, d++; 39 continue; 40 } 41 if (d==di[0]+1 && t!=ti[0]+1) { 42 xn+=(double(ti[t])-tn)*vn, tn=double(ti[t]), vn=(1/double(dv)), dv++, t++; 43 continue; 44 } 45 if (((di[d]-xn)/vn)<(ti[t]-tn) && d!=di[0]+1) 46 tn+=double(di[d]-xn)/vn, xn=double(di[d]), vn=(1/double(dv)), dv++, d++; 47 else if (t!=ti[0]+1) 48 xn+=(double(ti[t])-tn)*vn, tn=double(ti[t]), vn=(1/double(dv)), dv++, t++; 49 } 50 tn+=double(m-xn)/vn; 51 printf("%.0lf\n", tn-0.5); 52 } 53 54 int main() { 55 init(); 56 sovle(); 57 }
时间: 2024-10-14 20:23:43