求助
查看原帖
求助
713113
fishing_fly楼主2024/3/28 21:08
#include<bits/stdc++.h>
using namespace std;
int n,P;
long long ans=1e9,m[105][105],l[105][105],p[105][105];
bool check(long long x){
	for(int i=1;i<=n;i++){
		long long t=x/n;
		if(x%n+1>i)t++;
		for(int j=1;j<=n;j++){
			p[i][j]=max(l[i][j],m[i][j]-t);
		} 
	}
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				p[i][j]=min(p[i][j],p[i][k]+p[k][j]);
			}
		}
	}
	long long sum=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			sum+=p[i][j];
		}
	}
	return sum<=P;
}
int main(){
	cin>>n>>P;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>m[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>l[i][j];
		}
	}
	long long l=0,r=100005;
	while(l<=r){
		long long mid=(l+r)/2;
		if(check(mid)==1)ans=min(ans,mid),r=mid-1;
		else l=mid+1;
	}
	if(ans>100000)cout<<"-1";
	else cout<<ans;
}
2024/3/28 21:08
加载中...