zoukankan      html  css  js  c++  java
  • Codeforces Round #350 (Div. 2) D2 二分

    五一期间和然然打的团队赛..那时候用然然的号打一场掉一场...七出四..D1是个数据规模较小的题 写了一个暴力过了 面对数据如此大的D2无可奈何 现在回来看 一下子就知道解法了

    二分就可以 二分能做多少个 每次对mid求一下不够的差值 比较差值与m的大小进行l与r的变换

    由于自己一向对二分比较迷茫 自己琢磨出来一套神奇的办法面对边界数据

    当小于和大于的时候 抛弃mid值

    当等于的时候 直接break 然后打一发while试试能否向更好的情况偏移

    当然在这个题目中 如果是直接break的时候就不用偏移了

    使用了llu 如果lld的话貌似会挂的样子

    如果没有直接break出来的情况 最后l r mid 之间的差值一定就是1和0 那么l-5一定是小于三者的..

    llu小于0会直接转化为极大的值 所以需要if判断一下

    该去学习一下二分的姿势了...

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    #include<map>
    #include<queue>
    #include<iostream>
    #include<vector>
    #include<string>
    #include<set>
    using namespace std;
    unsigned long long int n,m;
    unsigned long long int a[100050];
    unsigned long long int b[100050];
    int main()
    {
        cin>>n>>m;
        for(int i = 1; i<=n; i++)
        {
            scanf("%llu",&a[i]);
        }
        for(int i = 1; i<=n; i++)
        {
            scanf("%llu",&b[i]);
        }
        unsigned long long int l  = 0;
        unsigned long long int r  = 3e9;
        unsigned long long mid;
        while(l<r)
        {
            mid=(l+r)/2;
            unsigned long long cz=0;
            for(int i = 1; i<=n; i++)
            {
                unsigned long long aa= a[i]*mid;
                if(b[i]<aa)
                {
                    cz+=(aa-b[i]);
                }
            }
            if(cz>m)
            {
                r=mid-1;
            }
            else if(cz<m)
            {
                l=mid+1;
            }
            else break;
        }
        unsigned long long cz=0;
        for(int i = 1; i<=n; i++)
        {
            unsigned long long aa= a[i]*mid;
            if(b[i]<aa)
            {
                cz+=(aa-b[i]);
            }
        }
        if(cz==m)
        {
            printf("%llu
    ",mid);
            return 0;
        }
        unsigned long long int z;
        if(mid<5)
            z=0;
        else
            z=mid-5;
        while(true)
        {
            z++;
            unsigned long long x=0;
            for(int i=1; i<=n; i++)
            {
                unsigned long long aa= a[i]*z;
                if(b[i]<aa)
                {
                    x+=(aa-b[i]);
                }
            }
            if(x>m)
                break;
        }
        printf("%llu
    ",z-1);
    }
    

      

  • 相关阅读:
    Java 基础知识总结
    AppScan-文件参数Shell命令注入
    AndroidKiller-下载使用
    代码技巧之常用快捷键的整理
    z-index的特点
    定位元素的异同点
    定位之固定定位
    定位之相对定位
    clear的值和特点及伪元素before和after的使用
    如何让元素消失在我们的视野中(面试题)
  • 原文地址:https://www.cnblogs.com/rayrayrainrain/p/5789697.html
Copyright © 2011-2022 走看看