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 ; }
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 ; }