P8794 [蓝桥杯 2022 国 A] 环境治理 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include <iostream>
using namespace std;
#define ll long long
const int N=150;
const int inf=0x7fffffff;
int n,q;
int d[N][N],l[N][N];
int t[N][N];
void floyd()
{for(int k=0;k<n;k++){for(int i=0;i<n;i++){for(int j=0;j<n;j++){t[i][j]=min(t[i][j],t[i][k]+t[k][j]);}}}
}
bool check(int mid)
{for(int i=0;i<n;i++)for(int j=0;j<n;j++)t[i][j]=d[i][j];//临时数组for(int i=0;i<n;i++){int x=mid/n;//x为mid天灰尘度下降的数值if(mid%n>=i+1)//如果治理的天数到第i号城市x++;for(int j=0;j<n;j++){t[i][j]=max(t[i][j]-x*2,l[i][j]);//治理的城市,与他相连的路都要减少,所以要减去x*2.}}floyd();//求灰尘度最小的路int res=0;for(int i=0;i<n;i++){for(int j=0;j<n;j++){res+=t[i][j];}}if(res>q)return false;elsereturn true;
}
int main()
{cin>>n>>q;for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>d[i][j];for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>l[i][j];int i=0,j=1e9,ans=-1;while(i<j)//二分所需的天数{int mid=(i+j)/2;if(check(mid))j=mid,ans=j;//如果永远不满足,则check()永远不会为trueelsei=mid+1;}cout<<ans;return 0;
}