码迷,mamicode.com
首页 > 其他好文 > 详细

[未解出,hzwer]挖掘机

时间:2015-10-23 22:46:02      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:

挖掘机(dig.*)

背景

         附中机房谁最虚?高二一班***!感觉很顺,是吧?

题目描述

         今天,丧尸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,保证输入的数字都是整数

 

技术分享
type arr=array[0..10000] of longint;

var t,d:arr;
    n,m,i,j,x,c,d1,t1,d2,t2,sum:longint;
    v,time,tt,pred,s:real;
    ans:int64;
    ss:string;

procedure sort(l,r: longint;var a:arr);
      var
         i,j,x,y: longint;
      begin
         i:=l;
         j:=r;
         x:=a[(l+r) div 2];
         repeat
           while a[i]<x do
            inc(i);
           while x<a[j] do
            dec(j);
           if not(i>j) then
             begin
                y:=a[i];
                a[i]:=a[j];
                a[j]:=y;
                inc(i);
                j:=j-1;
             end;
         until i>j;
         if l<j then
           sort(l,j,a);
         if i<r then
           sort(i,r,a);
      end;

procedure printf;
begin
    ans:=trunc(time);
    writeln(ans);
    halt;
end;

procedure init;
var i:longint;
begin
    readln(n,m);
    for i:=1 to n do
        begin
            readln(ss);
            x:=pos(Dist,ss);
            if x<>0 then
                begin
                    inc(d1);
                    delete(ss,1,5);
                    val(ss,d[d1],c);
                    continue;
                end
            else
                begin
                    inc(t1);
                    delete(ss,1,5);
                    val(ss,t[t1],c);
                    continue;
                end;
        end;
end;

procedure change;
begin
   // sort(1,t1,t);sort(1,d1,d);
    d2:=1;t2:=1;
    pred:=0;time:=0;
    sum:=0;
    v:=1;
    //d1:距离出现妹子总数;d2:当前出现的距离妹子的处理
    //d1:时间出现妹子总数;d2:当前出现的时间妹子的处理
    //sum:当前是第几个妹子
    //v:当前速度
    //pred:当前走过的路程;time:当前所用时间
end;

procedure main;
begin
    while (d2<=d1)and(t2<=t1) do
        begin
            tt:=(d[d2]-pred)/ v;
            if tt+time<=t[t2] then//先碰到距离妹子
                begin
                    time:=time+tt;
                    inc(sum);
                    v:=1/(sum+1);
                    pred:=d[d2];
                    inc(d2);
                    continue;
                end
            else
                begin
                    s:=v*(t[t2]-time);
                    pred:=pred+s;
                    time:=t[t2];
                    inc(sum);
                    v:=1/(sum+1);
                    inc(t2);
                    continue;
                end;
        end;
    if pred=m then printf;
    for i:=d2 to d1 do
        begin
            tt:=(d[d2]-pred)/ v;
            time:=time+tt;
            pred:=d[d2];
            inc(sum);
            v:=1/(sum+1);
        end;
    if pred=m then printf;
    for i:=t2 to t1 do
        begin
            s:=v*(t[t2]-time);
            pred:=pred+s;
            time:=t[t2];
            inc(sum);
            v:=1/(sum+1);
        end;
    if pred=m then printf;
    tt:=(m-pred)/ v;
    time:=time+tt;
    printf;
end;

begin
    assign(input,dig.in);
    assign(output,dig.out);
    reset(input);
    rewrite(output);
    init;
    change;
    main;
    close(input);
    close(output);
end.
View Code
技术分享
type arr=array[0..200000] of real;

var t,d:arr;
    ans:int64;
    n,m,per,i,j,lt,ld,nt:longint;
    x,nowt:real;

procedure sort(l,r: longint;var a:arr);
      var
         i,j:longint;x,y:real;
      begin
         i:=l;
         j:=r;
         x:=a[(l+r) div 2];
         repeat
           while a[i]<x do
            inc(i);
           while x<a[j] do
            dec(j);
           if not(i>j) then
             begin
                y:=a[i];
                a[i]:=a[j];
                a[j]:=y;
                inc(i);
                j:=j-1;
             end;
         until i>j;
         if l<j then
           sort(l,j,a);
         if i<r then
           sort(i,r,a);
      end;

procedure printf;
begin
    ans:=trunc(nowt);
    writeln(ans);
    halt;
end;

procedure change;
begin
    n:=1;
    m:=1;
    per:=1;
    lt:=1;
    ld:=1;
    nt:=1;
end;

procedure init;
var i,j:longint;ch:char;
begin
    readln(n,m);
    for i:=1 to n do
        begin
            read(ch);
            if ch=T then
                begin
                    for j:=1 to 3 do read(ch);
                    inc(lt);
                    readln(t[lt]);
                end
            else
                begin
                    for j:=1 to 3 do read(ch);
                    inc(ld);
                    readln(d[ld]);
                end;
        end;
end;

procedure main;
var nd:real;
begin
    inc(ld);
    d[ld]:=0.0;
    inc(ld);
    d[ld]:=m;
    for i:=1 to ld-1 do
        begin
            nd:=d[i];
            while (nd<d[i+1])and(nt<=lt)and(nowt+(d[i+1]-nd)*per>t[nt]) do
                begin
                    nd:=nd+(t[nt]-nowt)/per;
                    inc(per);
                    nt:=nt+1;
                    nowt:=t[nt];
                end;
            nowt:=nowt+(d[i+1]-nd)*per;
            inc(per);
        end;
end;

begin
    assign(input,dig.in);
    assign(output,dig.out);
    reset(input);
    rewrite(output);
    nowt:=0;
    change;
    init;
    sort(1,ld,d);
    sort(1,lt,t);
    main;
    printf;
    close(input);
    close(output);
end.
View Code

 

AC程序

技术分享
program dig;
procedure open;
begin
    assign(input,dig.in);
    assign(output,dig.out) ;
    reset(input);
    rewrite(output);
end;

procedure closs;
begin
   close(input);
   close(output);
end;

type zz=array[0..200001] of longint;
var
ch:char;
c,i,n,m,t1,d1,mz,q1,q2:Longint;
t,x:real;
ti,di:zz;
procedure sort(l,r: longint; var a:zz);
      var
         i,j,x,y: longint;
      begin
         i:=l;
         j:=r;
         x:=a[(l+r) div 2];
         repeat
           while a[i]<x do
            inc(i);
           while x<a[j] do
            dec(j);
           if not(i>j) then
             begin
                y:=a[i];
                a[i]:=a[j];
                a[j]:=y;
                inc(i);
                j:=j-1;
             end;
         until i>j;
         if l<j then
           sort(l,j,a);
         if i<r then
           sort(i,r,a);
      end;

begin
    open;
    readln(n,m);
    for i:=1 to n do
    begin
        read(ch);
        case ch of
        T:
        begin
            read(ch); read(ch); read(ch);
            inc(t1);
            readln(c);
            ti[t1]:=c;
        end;
        D:
        begin
            read(ch); read(ch); read(ch);
            inc(d1);
            readln(c);
            di[d1]:=c;
        end;
        end;
    end;
    sort(1,t1,ti);
    sort(1,d1,di);
    q1:=1; q2:=1;
    mz:=1;
    x:=0; t:=0;
    while (q1<=t1) or (q2<=d1) do
    begin
        if q1<=t1 then
        if ((ti[q1]-t)*(1/mz)+x<di[q2]) or (q2=d1+1) then
        begin
            x:=x+(ti[q1]-t)/mz;
            inc(mz);
            t:=ti[q1];
            inc(q1);
            //writeln(x:0:2, ,t:0:2);
        end;
        if q2<=d1 then
        if ((ti[q1]-t)*(1/mz)+x>di[q2]) or (q1=t1+1) then
        begin
            t:=t+(di[q2]-x)*mz;
            inc(mz);
            x:=di[q2];
            inc(q2);
            //writeln(x:0:2, ,t:0:2);
        end;
        if (q2<=d1) and (q1<=t1) then
        if ((ti[q1]-t)*(1/mz)+x=di[q2]) then
        begin
            t:=ti[q1];
            x:=di[q2];
            inc(mz,2);
            inc(q1);
            inc(q2);
        end;
    end;
    t:=t+(m-x)*(n+1);
    writeln(trunc(t));
    closs;
end.
View Code

 

[未解出,hzwer]挖掘机

标签:

原文地址:http://www.cnblogs.com/yangqingli/p/4905725.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!