NOIp模拟2 挖掘机

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIp模拟2 挖掘机相关的知识,希望对你有一定的参考价值。

试题描述

今天,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 }

 

以上是关于NOIp模拟2 挖掘机的主要内容,如果未能解决你的问题,请参考以下文章

神奇的幻方(NOIP2015)(真·纯模拟)

P1065 [NOIP2006 提高组] 作业调度方案(模拟)

NOIp模拟1 Incr(LIS的nlogn算法)

noip模拟赛 写代码

2019.5.25 Noip模拟测试2

YYH的营救计划(NOIP模拟赛Round 6)