zoukankan      html  css  js  c++  java
  • 两个二分

    http://acm.hdu.edu.cn/showproblem.php?pid=4190

    二分答案

    #include <iostream>
    using namespace std ;
    int a[500005] ;
    int main()
    {
        int n,b ;
        while(~scanf("%d%d",&n,&b),n!=-1)
        {
            int maxn=-1 ;
            for(int i=0 ;i<n ;i++)
            {
                scanf("%d",&a[i]) ;
                maxn=max(maxn,a[i]) ;    
            }
            int left,right,mid ;
            left=1,right=maxn ;
            int ans ;
            while(left<=right)
            {
                mid=(left+right)>>1 ;
                int sum=0 ;
                for(int i=0 ;i<n ;i++)
                {
                    sum+=a[i]/mid ;
                    if(a[i]%mid)
                        sum++ ;
                }
                if(sum>b)
                    left=mid+1 ;
                else
                {
                    ans=mid ;
                    right=mid-1 ;
                }
            }
            printf("%d
    ",ans) ;
        }
        return 0 ;
    }
    View Code

    http://codeforces.com/problemset/problem/380/A

    一大坨二分一句upper_bound就解决了

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    using namespace std ;
    int x[100005],l[100005],c[100005] ;
    __int64 p[100005] ;
    int main()
    {
        int m ;
        scanf("%d",&m) ;
        __int64 cnt=1 ;
        for(int i=0 ;i<m ;i++)
        {
            int op ;
            scanf("%d",&op) ;
            if(op==1)
            {
                scanf("%d",&x[i]) ;
                p[i]=cnt++ ; 
            }
            else
            {
                scanf("%d%d",&l[i],&c[i]) ;
                p[i]=cnt ;
                cnt+=l[i]*c[i] ;
            }
        }
        int n ;
        scanf("%d",&n) ;
        for(int i=0 ;i<n ;i++)
        {
            __int64 pos ;
            scanf("%I64d",&pos) ;
            while(1)
            {
                int left,right,mid ;
                int temp ;
                left=0,right=m-1 ;
                while(left<=right)
                {
                    mid=(left+right)>>1 ;
                    if(p[mid]>=pos)
                    {
                        temp=mid ;
                        right=mid-1 ;        
                    }
                    else if(p[mid]<pos)
                    {
                        temp=mid+1 ;
                        left=mid+1 ;
                    }
                    else
                    {
                        temp=mid ;
                        break ;
                    }
                }
                if(p[temp]!=pos)
                    temp-- ;
                //__int64 temp=upper_bound(p,p+m,pos)-p-1 ;
                if(x[temp])
                {
                    printf("%d ",x[temp]) ;
                    break ;    
                }
                pos=(pos-p[temp])%l[temp]+1 ;
            }
        }
        return 0 ;
    }
    View Code
  • 相关阅读:
    margin塌陷(collapse)
    this的值
    变量、函数声明提升
    Git与Svn的区别—笔记1
    ECMAScript 总结
    正则表达式
    i2c 通信
    player/stage 学习---安装
    各种分区类型对应的partition_Id
    ubuntu 映射网络驱动器到本地
  • 原文地址:https://www.cnblogs.com/xiaohongmao/p/3524629.html
Copyright © 2011-2022 走看看