「NOIP模拟赛」挖掘机
背景
附中机房谁最虚?高二一班***!感觉很顺,是吧?
题目描述
今天,丧尸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个时变为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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<set> #include<ctime> #include<queue> #include<cmath> #include<vector> #include<algorithm> #include<map> #define inf 1000000000 #define ll long long #define double long double using namespace std; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n; double m,ans; int t1,t2; double t[200005],d[200005]; void solve() { int a=1,b=1; double time=0,v=0,dis=0; while(a<=t1||b<=t2) { v=1/(double)(a+b-1); if(((t[a]-time)*v<(d[b]-dis)&&a<=t1)||b>t2) { dis+=(t[a]-time)*v; time=t[a]; a++; } else { time+=(d[b]-dis)/v; dis=d[b]; b++; } } ans=time+(m-dis)*(n+1); } int main() { //freopen("dig.in","r",stdin); //freopen("dig.out","w",stdout); n=read();m=read(); char ch[5]; for(int i=1;i<=n;i++) { scanf("%s",ch); if(ch[0]=='T')t[++t1]=read(); else d[++t2]=read(); } sort(t+1,t+t1+1); sort(d+1,d+t2+1); solve(); printf("%I64d",(ll)ans); return 0; } |
Subscribe