• JZOJ 1422. 猴子摘桃


    题目

      

    Description

      动物园内最受欢迎就是猴子了,因为它们除了能爬能跳外还会很多技能。其中A类猴子特别擅长爬树摘桃,而B类猴子擅长把桃子掰成两半。
      A类猴子有N只,编号为1到N,B类猴子有M只,编号为1到M。A类猴子中的第K只摘到第一个桃子需要花费A_k秒,此后每B_k秒就能摘到桃子;B类猴子中的第K只掰开第一个桃子需要花费C_k秒,此后每D_k秒就能掰开一个桃子。
      不幸的是,B类猴子非常具有侵略性,两种猴子不能同时待在场地内,因此,园长必须在A类猴子摘完所有桃子后立刻把它们带走,然后立刻让B类猴子进园;同样当B类猴子把所有桃子全部掰开后也不能待在场地内太久,因为它们之间也会发生冲突,所有园长将在B类猴子掰开所有桃子后立刻送走它们。
      园长带走猴子和猴子进园的速度非常快,时间忽略不计。
      Alice非常喜欢看B类猴子掰桃子,告诉你表演的总时间,但不知道一共有多少个桃子,请你帮Alice计算B类猴子进入动物园的时刻。

     

     

     

    Input

      输入文件第一行包含一个整数T(1<=T<=1000000000),表示猴子表演的总时间。
      接下来一行包含一个整数N(1<=N<=100),表示A类猴子的数量。
      接下来N行,每行包含两个整数A_k和B_k(1<=A_k,B_k<=1000000000),描述A类每只猴子摘桃的速度。
      接下来一行包含一个整数M(1<=M<=100),表示B类猴子的数量。
      接下来M行,每行包含两个整数C_k和D_k(1<=C_k,D_k<=1000000000),描述B类每只猴子掰桃的速度。

    Output

      输出两类猴子进园的时刻相差多少秒。

     

     

     

    Sample Input

    输入1:
    12
    1
    3 1
    1
    5 1
    
    输入2:
    20
    2
    3 2
    1 3
    3
    3 1
    4 1
    5 1
    

    Sample Output

    输出1:
    5
    
    输出2:
    13

     

     

     

    Data Constraint

     

     

     

     

    Hint

    【样例说明】
      样例1中,树上有3个桃子:
      (1) A类猴子在3秒时摘下第一个桃子,在4秒时摘下第二个桃子,在5秒时摘下第三个桃子;
      (2) 在第5秒,园长把A类猴子带走,此时B类猴子进园;
      (3) B类猴子在10秒时掰开第一个桃子,在11秒时掰开第二个桃子,在第12秒时掰开第三个桃子;
      (4) 在12秒时园长进园带走B类猴子。

     

     

    分析

    • 因为有分两种时间,显然是个二分

    • 检验是否S1<=S2

     

    代码

     

     1 #include<iostream>
     2 using namespace std;
     3 int t,n,m;
     4 int a[100001][2],b[100001][2];
     5 int ans;
     6 int main ()
     7 {
     8     cin>>t>>n;
     9     for (int i=1;i<=n;i++)
    10         cin>>a[i][0]>>a[i][1];
    11     cin>>m;
    12     for (int i=1;i<=m;i++)
    13         cin>>b[i][0]>>b[i][1];
    14     int l=1,r=t,mid;
    15     while (l<=r)
    16     {
    17         mid=(l+r)/2;
    18         int s1=0,s2=0,t1=mid,t2=t-mid;
    19         for (int i=1;i<=n;i++)
    20         {
    21             if (t1>=a[i][0])
    22               s1+=1+(t1-a[i][0])/a[i][1];
    23         }
    24         for (int i=1;i<=m;i++)
    25         {
    26             if (t2>=b[i][0])
    27               s2+=1+(t2-b[i][0])/b[i][1];
    28         }
    29         if (s1<=s2)
    30         {
    31             ans=mid;
    32             l=mid+1;
    33         }
    34         else r=mid-1;
    35     }
    36     cout<<ans; 
    37 }

     

     

    为何要逼自己长大,去闯不该闯的荒唐
  • 相关阅读:
    POJ 1887 Testing the CATCHER
    HDU 3374 String Problem
    HDU 2609 How many
    POJ 1509 Glass Beads
    POJ 1458 Common Subsequence
    POJ 1159 Palindrome
    POJ 1056 IMMEDIATE DECODABILITY
    POJ 3080 Blue Jeans
    POJ 1200 Crazy Search
    软件体系结构的艺术阅读笔记1
  • 原文地址:https://www.cnblogs.com/zjzjzj/p/11100040.html
Copyright © 2020-2023  润新知