二分:吃巧克力

    科技2022-07-20  104

    题目链接:点击这里

    #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #define int long long #define ll long long using namespace std; int n,d; int left=0; int right =0; int a[500005]; int res[500005]; int knoe; int mid; int res_cnt=0; bool check(int x){ int sum=0; int ans=0;//a数组下标 for(int i=1;i<=d;++i){ sum=sum>>1; while(sum<x&&ans<n){ sum+=a[ans++]; } if(sum<x){ return false; } } return true; } signed main() { scanf("%lld%lld",&n,&d); for(int i=0;i<n;++i){ scanf("%lld",&a[i]); right+=a[i]; } while (left <= right) { //printf("%d %d\n",left,right); mid=(left+right)/2; if(!check(mid)){ right = mid - 1; } else{ knoe=mid; left=mid+1; } } printf("%lld\n",knoe); int sum=0; int ans=0; for(int i=1;i<=d;++i){ sum=sum>>1; while(sum<knoe&&ans<n){ sum+=a[ans++]; res[res_cnt++]=i; } } while(ans++<n){ res[res_cnt++]=d; }//吃不完的最后一天一起吃 for(int i=0;i<res_cnt;++i){ printf("%lld\n",res[i]); } return 0; }
    Processed: 0.012, SQL: 8