一个可以“时间回溯”的代码!
查看原帖
一个可以“时间回溯”的代码!
603121
LEWISAK楼主2024/3/27 17:23

如果对以下代码输入:

3 2                           
1 
1
10

输出结果为: 10

#include<bits/stdc++.h>
using namespace std;
int n,m,a[51000],sum[51000],dp[51000],vis[51000],summ[51000],ans;
bool check(int x){
	int cnt=0,flag=0;
	for(int i=1;i<=n+1;i++){
		if(cnt+a[i]>=x){
			flag++;
			cnt=0;
		}
		cnt+=a[i];
	}
	return flag<=m;
} 
int main(){
	cin>>n>>m;
	int l;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		l=max(l,a[i]);
		summ[i]=summ[i-1]+a[i];
	}
	a[n+1]=1e9+1;
	int r=1e9,mid;
	while(l<=r){
		mid=(l+r)/2;
		if(check(mid)){
			r=mid-1;
		}
		else{
			l=mid+1;
		}
	}
	cout<<l<<" ";
  while(1){}
	int fw=0;
	for(int i=1;i<=n;i++){
		for(;fw<i;fw++){
			if(sum[i]-sum[fw]<=l){
				vis[i]=fw;
				break;
			}
		}
	}
	
	for(int i=1;i<=n;i++){
		if(summ[i]<=l){
			dp[i]=1;
		}
		sum[i]=sum[i-1]+dp[i];
	}
	for(int i=1;i<=m;i++){

		for(int j=1;j<=n;j++){
			if(vis[j]){
				dp[j]=sum[j-1]-sum[vis[j]-1];
			}
			else{
				dp[j]=sum[j-1];
			}
		}
		for(int j=1;j<=n;j++){
			sum[j]=sum[j-1]+dp[j];
		}
		ans+=dp[l];
	}
	cout<<ans;
}

但如果将while1删除:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[51000],sum[51000],dp[51000],vis[51000],summ[51000],ans;
bool check(int x){
	int cnt=0,flag=0;
	for(int i=1;i<=n+1;i++){
		if(cnt+a[i]>=x){
			flag++;
			cnt=0;
		}
		cnt+=a[i];
	}
	return flag<=m;
} 
int main(){
	cin>>n>>m;
	int l;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		l=max(l,a[i]);
		summ[i]=summ[i-1]+a[i];
	}
	a[n+1]=1e9+1;
	int r=1e9,mid;
	while(l<=r){
		mid=(l+r)/2;
		if(check(mid)){
			r=mid-1;
		}
		else{
			l=mid+1;
		}
	}
	cout<<l<<" ";
	
	int fw=0;
	for(int i=1;i<=n;i++){
		for(;fw<i;fw++){
			if(sum[i]-sum[fw]<=l){
				vis[i]=fw;
				break;
			}
		}
	}
	
	for(int i=1;i<=n;i++){
		if(summ[i]<=l){
			dp[i]=1;
		}
		sum[i]=sum[i-1]+dp[i];
	}
	for(int i=1;i<=m;i++){
	
		for(int j=1;j<=n;j++){
			if(vis[j]){
				dp[j]=sum[j-1]-sum[vis[j]-1];
			}
			else{
				dp[j]=sum[j-1];
			}
		}
		for(int j=1;j<=n;j++){
			sum[j]=sum[j-1]+dp[j];
		}
		ans+=dp[l];
	}
	cout<<ans;
}

程序就会输出4255529

有没有大佬解释一下?

已经确认与同步流有关(关闭同步流后直接不输出了)

大胆猜测数组越界
2024/3/27 17:23
加载中...