标签:n+1 代码 分析 表示 bsp 问题 存储 noip strong
试题描述 |
今天,czy开着挖掘机去上学(……)。但是他发现他的mz满天下,所以一路上他碰到了好多他的mz。一开始他以1km/min的速度(=60km/h……)开着挖掘机前进。 |
输入格式 |
输入第一行2个数n,m,分别表示mz数和czy与学校的距离(km) |
输出格式 |
输出一个整数,表示到达学校的时间。如果不能整除,直接输出整数部分即可。 |
输入示例 |
2 20 |
输出示例 |
47 |
注释说明 |
对于30%数据,n,m<=50 |
【分析】
模拟,分别存储按时间出现和按路程出现的妹子,每次比较时间,注意判断边界。
时间一急写得就很乱,反正也没人会看啦~
【代码】
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 }
标签:n+1 代码 分析 表示 bsp 问题 存储 noip strong
原文地址:http://www.cnblogs.com/shamman/p/7348491.html