如果对以下代码输入:
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
有没有大佬解释一下?
已经确认与同步流有关(关闭同步流后直接不输出了)