1. 程式人生 > >NOIp模擬2 挖掘機

NOIp模擬2 挖掘機

using scanf 註釋 clas 試題 min sca sort std

試題描述

今天,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 挖掘機