RT,这题我二分上界设 1e8,eps 设 1e-9 就会 WA,把上界改成 1e6 反而过了。请问这是为什么啊?/yun
//author:望远星
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sml(x,y) (x=min(x,y))
#define big(x,y) (x=max(x,y))
#define ll long long
#define ull unsigned long long
#define db double
#define fo(i,x,y) for(int i=x;i<=y;++i)
#define go(i,x,y) for(int i=x;i>=y;--i)
using namespace std;
inline int read(){int x=0,fh=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-') fh=-1; ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0'; ch=getchar();} return x*fh;}
inline void out(int *a,int l,int r){fo(i,l,r) cout<<*(a+i)<<' ';puts("");}
const int N=1e6+5,inf=1e9;
const db eps=1e-9;
struct Edge{
int to,next,r;
db c;
}e[N];
int head[N],tot,n,a[101][101],b[101][101],now[N],ins[N],vis[N],ti,s,t;
db dis[N],cost;
void connect(int x,int y,int r,db c){
e[++tot]=(Edge){y,head[x],r,c};
head[x]=tot;
}
void add(int x,int y,int r,db c){
connect(x,y,r,c);
connect(y,x,0,-c);
}
bool spfa(){
//puts("spfa()");
fo(i,1,t) dis[i]=inf,ins[i]=0;dis[s]=0;
queue<int> q;q.push(s);
while(!q.empty()){
int x=q.front();q.pop();
now[x]=head[x];
ins[x]=0;
for(int i=head[x];i;i=e[i].next)if(e[i].r){
int p=e[i].to;
//printf("awa %d->%d\n",x,p);
if(dis[p]-(dis[x]+e[i].c)>eps){
dis[p]=dis[x]+e[i].c;
if(!ins[p]) q.push(p),ins[p]=1;
}
}
}
return dis[t]<inf;
}
int dfs(int x,int lim){
//printf("dfs(%d,%d)\n",x,lim);
if(x==t) return lim;
vis[x]=ti;int ret=0;
for(int i=now[x];i;i=e[i].next,now[x]=i)if(e[i].r){
int p=e[i].to;//printf("qwq %d->%d\n",i,p);
if(fabs(dis[p]-(dis[x]+e[i].c))>eps||vis[p]==ti) continue;
int k=dfs(p,min(lim,e[i].r));
e[i].r-=k,e[i^1].r+=k;
cost+=k*e[i].c;
lim-=k,ret+=k;
if(!lim) break;
}
vis[x]=0;
return ret;
}
signed main(){
cin>>n;
fo(i,1,n) fo(j,1,n) a[i][j]=read();
fo(i,1,n) fo(j,1,n) b[i][j]=read();
db l=0.0,r=1e6,ans;s=n<<1|1,t=s+1;
while(r-l>eps){
db mid=(l+r)/2;//mid=10.0/2;
tot=1;fo(i,1,t) head[i]=0;
fo(i,1,n) fo(j,1,n) add(i,j+n,1,-a[i][j]+mid*b[i][j]);
fo(i,1,n) add(s,i,1,0);fo(i,1,n) add(i+n,t,1,0);
cost=0;
while(spfa()) ++ti,dfs(s,inf);
if(cost<=0||fabs(cost)<eps) l=mid+eps,ans=mid;
else r=mid-eps;
}
printf("%.6f\n",ans);
return 0;
}