zoukankan      html  css  js  c++  java
  • 【二分】——COCI2008 猴子摘桃

    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

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

      二分能完成的题目一般都有个特点:答案一定是具有单调性且有固定值域的,假如我们枚举时间,那么它的值域即为(0,t),因此在这个区间二分答案,对于一个状态,比较摘下来的桃子比劈开的桃子多还是少,来重新确定范围。

      细节请看标程。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=110;
     4 int t,n,m;
     5 int x_1[N],x_2[N];
     6 int y_1[N],y_2[N];
     7 int ans;
     8 int read(){
     9     int x=0,f=1;
    10     char c=getchar();
    11     while(!isdigit(c)){
    12         if(c=='-') f=-1;
    13         c=getchar();
    14     }
    15     while(isdigit(c)){
    16         x=x*10+c-'0';
    17         c=getchar();
    18     }
    19     return x*f;
    20 }
    21 int main(){
    22     t=read();
    23     n=read();
    24     for(int i=1;i<=n;i++){
    25         x_1[i]=read();
    26         x_2[i]=read();
    27     }
    28     m=read();
    29     for(int i=1;i<=m;i++){
    30         y_1[i]=read();
    31         y_2[i]=read();
    32     }
    33     int l=0,r=t;
    34     while(l<=r){
    35         int mid=(l+r)>>1,tg1=0,tg2=0;
    36         for(int i=1;i<=n;i++){
    37             if(mid>=x_1[i]){
    38                 tg1+=1+(mid-x_1[i])/x_2[i];
    39             }
    40         }
    41         for(int i=1;i<=m;i++){
    42             if(t-mid>=y_1[i]){
    43                 tg2+=1+(t-mid-y_1[i])/y_2[i];
    44             }
    45         }
    46         if(tg1<=tg2){
    47             ans=mid;
    48             l=mid+1;
    49         }
    50         else r=mid-1;
    51     }
    52     printf("%d",ans);
    53     return 0;
    54 } 
    ——抓住了时间,却不会利用的人,终究也逃不过失败的命运。
  • 相关阅读:
    java内部类与其他类变量之间的调用方式
    java线程数设置和系统cpu的关系
    IDEA设置方法自动显示参数提示
    (十)学生课程表查询
    (九)协处理器
    (八)filter的使用
    (七)多线程写入数据
    (六)mapreduce和Hbase集成
    (五)阅读推荐
    (四)region代码实现
  • 原文地址:https://www.cnblogs.com/Nelson992770019/p/11455368.html
Copyright © 2011-2022 走看看