30pts求助
查看原帖
30pts求助
1048333
dmc0702楼主2024/10/23 18:33
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node{
	int left,val;
	bool f;
};
int n,d,sum=0,ans=0;
int a[1000005];
node check1(int pre,int day,int x,int left){
	while(pre<x&&left<=d)
		pre+=a[left],left++;
	node p;
	p.left=left;
	p.val=pre;
	p.f=(pre>=x);
	return p;
}
node check2(int pre,int day,int x,int left){
	while(pre<x&&left<=d)
		cout<<"\n"<<day,pre+=a[left],left++; 
	node p;
	p.left=left;
	p.val=pre;
	p.f=(pre>=x);
	return p;
}
bool check(int mid){
	int sum=0,left=1;
	for(int i=1;i<=d;i++){
		sum/=2;
		node p=check1(sum,i,mid,left);
		left=p.left;
		if(p.f==false)
			return false;
		sum=p.val;
	}
	return true;
}
bool pr(int mid){
	int sum=0,left=1;
	for(int i=1;i<=d;i++){
		sum/=2;
		node p=check2(sum,i,mid,left);
		left=p.left;
		if(p.f==false)
			return false;
		sum=p.val;
	}
	for(int i=left;i<=d;i++)
		cout<<"\n"<<d;
	return true;
}
signed main(){
	ios::sync_with_stdio(false),cin.tie(0);
	cin>>n>>d;
	for(int i=1;i<=n;i++)
		cin>>a[i],sum+=a[i];
	int left=0,right=sum;
	while(left<=right){
		int mid=(left+right)/2;
		if(check(mid))
			left=mid+1,ans=mid;
		else
			right=mid-1;
	}
	cout<<ans;
	pr(ans);
	return 0;
}
2024/10/23 18:33
加载中...