题意:
能力有限,没有一句话题意,自己看吧
分析:
求盈利效率最大,要么贪心,要么分数规划,贪心不太现实,那就只能考虑分数规划了。所以我们要处理处分数规划所需要的价值和体积,由于这道题的(n)极小,只有100,完全可以floyd处理
tip:需要注意的就是,分数规划时会给(ans)乘上体积,若体积初始化为极大值会爆精度,所以体积初始化的时候手动赋值为一个较大的就可以了
代码:
#include<bits/stdc++.h>
using namespace std;
namespace zzc
{
const int maxm = 1e4+5;
const int inf = 1e9+5;
long long n,m,t;
long long b[105][1005],s[105][1005],val[105][105],dis[105][105],f[105][105];
bool check(long long x)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j) f[i][j]=-0x3f3f3f;
else f[i][j]=val[i][j]-x*dis[i][j];
}
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
f[i][j]=max(f[i][k]+f[k][j],f[i][j]);
}
}
}
long long tmp=-0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
tmp=max(tmp,f[i][i]);
}
return tmp>=0;
}
long long getans()
{
long long l=0,r=1e9,mid,res;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid))
{
res=mid;
l=mid+1;
}
else r=mid-1;
}
return res;
}
void work()
{
scanf("%lld%lld%lld",&n,&m,&t);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=t;j++)
{
scanf("%lld%lld",&b[i][j],&s[i][j]);
if(b[i][j]==-1) b[i][j]=inf;
if(s[i][j]==-1) s[i][j]=-inf;
}
}
for(int k=1;k<=t;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
val[i][j]=max(val[i][j],s[j][k]-b[i][k]);
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dis[i][j]=inf;
}
}
for(int i=1;i<=m;i++)
{
long long a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
dis[a][b]=c;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dis[i][k]==inf||dis[k][j]==inf) continue;
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
printf("%lld
",getans());
}
}
int main()
{
zzc::work();
return 0;
}