☆游乐园 二分+模拟

 
   
 
From KQZXCMH
游乐园
 
   

 

 

 

 

背景 Background

 

 

清北学堂TYVJ9月模拟赛试题第一题

 

 

 

 

 

 

 

描述 Description

 

 

  游乐园里新推出一个游戏——飞机驾驶体验。有N-1个小朋友来玩这个游戏,他们排成长长的一列。这个游戏一共有M架“飞机”可供驾驶,每架飞机的使用时间都是有限制的,第i架“飞机”的使用时间是si分钟。
  一开始所有“飞机”都是闲置着的,然后排队等候着的小朋友依次上“飞机”。如果有飞机闲置,则小朋友一定会上去玩(小朋友不会在意飞机使用的时间);如果同时有多架“飞机”闲置着,小朋友一定会选择标号最小的那架。
  现在你带着你的弟弟来到了游乐园,排到了最后一个位置。你想知道你弟弟会在哪架“飞机”上体验。

 

 

 

 

 

 

 

输入格式 Input Format

 

 

第一行两个数N和M。
接下来一行M个数,第i个表示si。

 

 

 

 

 

 

 

输出格式 Output Format

 

 

输出一个数,表示你弟弟会坐上哪架飞机。

 

 

 

 

 

 

 

样例输入 Sample Input [复制数据]

 

 

 

 

 

 

 

 

 

样例输出 Sample Output [复制数据]

 

 

 

 

 

 

 

 

 

时间限制 Time Limitation

 

 

时间限制 1s

 

 

 

 

 

 

 

注释 Hint

 

 

数据规模
对于30% 的数据 N≤1 000 000;
对于100% 的数据 1≤N≤1 000 000 000,1≤M≤1 000。

 

 

二分出N上飞机的时间mid。计算出前mid-1秒有好多个人在飞机上了,并且算出再mid的时候有好多灰机刚好没人、

 

tot:=tot+(mid-2+time[i])div time[i]; //这里处理 向上取整。在mid-1秒前有人在飞机上了。

 

const md=20000000000;
var a:array[0..2000] of longint;
v:array[0..2000] of boolean;
n,m,i,j,k,sum:longint;
l,r,mid:int64;
procedure ok;
var i,j,k:longint;
now,tot:int64;
begin
 now:=0; tot:=0;
 fillchar(v,sizeof(v),0);
 for i:=1 to m do
  begin
  if (mid-1) mod a[i]=0 then
   begin
    inc(now); v[i]:=true;
   end;
  tot:=tot+(mid-2+a[i]) div a[i];
  end;
  if tot>=n then begin r:=mid-1; exit; end;
  if tot+now<n then begin l:=mid+1; exit; end;
  for i:=1 to m do
   if v[i] then
   begin
    inc(tot);
    if tot=n then
     begin
      writeln(i); halt;
     end;
   end;
end;
begin
 readln(n,m);
 for i:=1 to m do read(a[i]);
 l:=0; r:=md;
 while l<=r do
  begin
   mid:=(l+r) div 2;
   ok;
  end;
end.


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值