bjyb


私信TA

用户名:dotcpp0610982

访问量:1453

签 名:

等  级
排  名 2064
经  验 2395
参赛次数 0
文章发表 23
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:
明显答案有单调性,故可以使用二分,将灰尘度看为路径长度,可以使用最短路求解。
注意事项:
注意一些限制条件,复杂度(O(n^3logm))。
参考代码:


#include

using namespace std;

#define maxx 101000

#define int long long

#define INF 0x3f3f3f3f

int n,Q,l=0,r=0;

int G[102][102];

int all[102][102];

int lim[102][102];

int check(int i)

{

  int now=(i-1)%n;

  int sum=(i-1)/n;

  for(int i=0;i<n;++i)

   for(int j=0;j<n;++j)

    all[i][j]=G[i][j];

  for(int i=0;i<n;++i)

   for(int j=0;j<n;++j)

    {if(i<=now) --all[i][j];

    if(j<=now) --all[i][j];

    all[i][j]=all[i][j]-2*sum;

    all[i][j]=max(all[i][j],lim[i][j]);

    }

   for(int k=0;k<n;++k)

    for(int i=0;i<n;++i)

     for(int j=0;j<n;++j)

      all[i][j]=min(all[i][j],all[i][k]+all[k][j]);

       int ans=0;

   for(int i=0;i<n;++i)

     for(int j=0;j<n;++j)

      ans+=all[i][j];

      if(ans<=Q) return 1;

      else return 0;

}


signed main()

{

  cin>>n>>Q;

 

  for(int i=0;i<n;++i)

    for(int j=0;j<n;++j)

      cin>>G[i][j];

 for(int i=0;i<n;++i)

    for(int j=0;j<n;++j)

      cin>>lim[i][j];

  for(int i=0;i<n;++i)

    for(int j=0;j<n;++j)

     r=max(r,G[i][j]-lim[i][j]);

     r=r*n;

     if(!check(r)) {cout<<"-1"; return 0;}

     if(check(l)) {cout<<"0";return 0;}

   while(l<r)

    {

      int mid=(l+r)/2;

      if(!check(mid)) l=mid+1;

      else r=mid;

    }

    cout<<l;

 


}


 

0.0分

1 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区