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\n",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