BNU 49103 贪心【二分+贪心】

贪心

Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:  %lld      Java class name:  Main
Type: 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •                   
  • 小明喜欢养小鸡,小鸡喜欢吃小米。小明很贪心,希望养s只不同种类的小鸡,小鸡也很贪心,每天除了吃固定的ai粒小米外,还想多吃bi*s粒小米。

    小明每天有M(0<=M<=10^9)粒小米可以喂小鸡,小鸡共有N(0<=N<=1000)种。问小明最多可以养多少只小鸡?

     

    Input

    多组数据,请读到文件尾

    第一行,整数N,M,以空格分隔,之后两行,第一行为N个整数ai,第二行为N个整数bi。

    ai、bi都在int范围内

    Output

    一行一个整数,s。

     

    Sample Input

    2 41	
    4 0
    9 4

    Sample Output

    2

    Source

    Author

    dlj

    思路:


    1、考虑到随着选择鸡的个数增加,而会升高花费,那么我们肯定直接贪心或者是Dp之类的解法肯定是不行的。


    2、既然随着选择鸡的个数的增加,会升高花费,那么我们部分囊二分选择鸡的个数。

    选的鸡越多,越不能养的起。

    所以我们二分选择鸡的个数,然后按照花费贪心一下判定即可。


    Ac代码:

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    #define ll long long int
    struct node
    {
        ll x,y,ss;
    }a[150000];
    ll n,m;
    ll cmp(node a,node b)
    {
        return a.ss<b.ss;
    }
    int Slove(ll mid)
    {
        ll sum=0;
        for(ll j=1;j<=n;j++)a[j].ss=mid*a[j].y+a[j].x;
        sort(a+1,a+1+n,cmp);
        for(ll j=1;j<=mid;j++)
        {
            sum+=a[j].ss;
        }
        if(sum<=m)return 1;
        else return 0;
    }
    int main()
    {
        while(~scanf("%lld%lld",&n,&m))
        {
            ll output=0;
            for(ll i=1;i<=n;i++)scanf("%lld",&a[i].x);
            for(ll i=1;i<=n;i++)scanf("%lld",&a[i].y);
            ll l=0;
            ll r=n;
            while(r-l>=0)
            {
                ll mid=(l+r)/2;
                if(Slove(mid)==1)
                {
                    output=mid;
                    l=mid+1;
                }
                else r=mid-1;
            }
            printf("%lld\n",output);
        }
    }








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

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

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

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值