提交时间:2024-10-02 13:10:02

运行 ID: 32854

#include <bits/stdc++.h> using namespace std; // #define int long long // #define double long double int n,m; int a[100]; bool g[110][110]; vector<int>G[110]; bool p[110]; double S,S2; double res=1; inline void dfs(int dep){ if(dep==n+1){ // cerr<<dep<<" "<<S<<" "<<S2<<endl; if(S2) res=max(res,S*S/S2); return ; } if(p[dep]){ S+=a[dep]; S2+=a[dep]*a[dep]; dfs(dep+1); S-=a[dep]; S2-=a[dep]*a[dep]; return ; } dfs(dep+1); vector<int>T; bool ok=1; for(int j:G[dep]) if(!p[j]){ if(j<dep) ok=0; else p[j]=1, T.emplace_back(j); } if(!ok)return ; S+=a[dep]; S2+=a[dep]*a[dep]; dfs(dep+1); S-=a[dep]; S2-=a[dep]*a[dep]; for(int x:T) p[x]=0; } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("ex_sale1.in","r",stdin); // freopen("sale.out","w",stdout); cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i],g[i][i]=1; if(m==0){ double mx=1; sort(a+1,a+n+1); for(int l=1;l<=n;l++) for(int r=l+1;r<=n;r++){ double s=0,s2=0; for(int i=l;i<=r;i++) s+=a[i],s2+=a[i]*a[i]; // cout<<l<<" "<<r<<" "<<s<<" "<<s2<<endl; mx=max(s*s/s2,mx); } printf("%.10lf\n",mx); } else{ for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; g[u][v]=1; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) g[i][j]|=g[i][k]&g[k][j]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(g[i][j])G[i].push_back(j); dfs(1); printf("%.10lf\n",res); } cout.flush(); fflush(stdout); return 0; }