2017.5.27测试 2. 刷题(P1167)

2 刷题

(c.pas/cpp/c)

【题目背景】

“好啊!一言为定!!”,作为蒟蒻的GJY竟然约定和神犇来一场世纪大战。

【题目描述】

GJY在期末的时候跟神犇约定了一次战争,这对于GJY来说可是一件具有挑战性并十分困难的事情。所有GJY从现在开始就要努力学习,认真学习。GJY为了赢过神犇可以不惜一切代价,就算是让她废寝忘食也是可以的。“不吃饭,不睡觉,不吃零食多思考”是她的宣战格言。给定一个GJY开始奋斗的时间,精确到分钟单位(xxxx[年]-yy[月]-zz[日]-hh[时]-ss[分]),和一个她和神犇大战的时间(xxxx[年]-yy[月]-zz[日]-hh[时]-ss[分])。GJY还有一种特殊的能力,就是她可以判断出她做一道题要花的时间,但她因为判断废了太多的脑力,所以就请聪明的你帮她看一下他在这一段时间内最多可以做多少道题目,GJY的命运就靠你来计算了。

【输入格式】

第一行输入一共有n道题目;

接下来2到n+1行输入这道题需要花费的时间。

第n+2行输入GJY开始奋斗的时间(xxxx[年]-yy[月]-zz[日]-hh[时]:ss[分]);

第n+3行输入GJY和神犇约定好的时间(xxxx[年]-yy[月]-zz[日]-hh[时]:ss[分]);

【输出格式】

一行输出在此时间内GJY最多能做多少题目。

【样例输入】

4

1

1

1

1

2017-1-21-11:29

2017-1-21-11:30

【样例输出】

1

样例解释:GJY一共有一分钟的时间可以做题,在这一分钟内她可以做一道题,所以答案为1.

【数据范围】

对于100%的数据,n≤5000,每道题所要花的时间≤10000。

const
 d:array[1..12]of longint=(31,28,31,30,31,30,31,31,30,31,30,31);//每个月的天数
type
 arr=array[1..6]of longint;
var
 s:string;
 a:array[0..5000]of longint;
 b,c:array[1..6]of longint;
 n,i,j,x,y,z,ans:longint;
 t:qword;
procedure qsort(l,r:longint);//快排~
var
 i,j,key,temp:longint;
begin
 if l>=r then exit;
 i:=l;j:=r;
 key:=a[l+random(r-l+1)];
 repeat
  while (a[i]<key) do inc(i);
  while (a[j]>key) do dec(j);
  if i<=j then
   begin
    temp:=a[i];a[i]:=a[j];a[j]:=temp;
    inc(i);dec(j);
   end;
 until i>j;
 qsort(l,j);
 qsort(i,r);
end;
procedure try(var x:arr);//拆分并转换回数字~
var
 ss:string;
 t:longint;
begin
 t:=pos('-',s);
 while t<>0 do
  begin
   inc(j);
   ss:=copy(s,1,t-1);
   val(ss,x[j]);
   if j=3 then x[6]:=x[6]+x[j]*24*60;//一天有24个小时,有24*60分钟(那x天也一样)
   delete(s,1,t);
   t:=pos('-',s);
  end;
 t:=pos(':',s);
 inc(j);
 ss:=copy(s,1,t-1);
 val(ss,x[j]);
 x[6]:=x[6]+x[j]*60;//一小时有60个分钟(那x小时也一样)
 delete(s,1,t);
 inc(j);
 ss:=copy(s,1,2);
 val(ss,x[j]);
 x[6]:=x[6]+x[j];//分钟就是分钟啦
end;
begin
 readln(n);
 for i:=1 to n do readln(a[i]);
 qsort(1,n);
 readln(s);
 try(b);
 j:=0;
 readln(s);
 try(c);
 for i:=1 to b[2]-1 do b[6]:=b[6]+d[i]*24*60;//b[2]-1是因为目前在该月,没有超过
 for i:=1 to c[2]-1 do c[6]:=c[6]+d[i]*24*60;
 t:=c[6]-b[6];//统计一下
 for i:=b[1] to c[1]-1 do
  if (i mod 4=0) and (i mod 100<>0) or (i mod 400=0) and (i mod 100=0)then t:=t+366*24*60 //判断闰年
                                                                      else t:=t+365*24*60;
 for i:=1 to n do
  if t>=a[i] then begin
                   t:=t-a[i];
                   inc(ans);
                  end
             else break;
 writeln(ans);
end.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值