比赛 2024暑假C班集训A 评测结果 AWWWWWWWWW
题目名称 制作人偶 最终得分 10
用户昵称 djyqjy 运行时间 0.074 s
代码语言 C++ 内存使用 4.25 MiB
提交时间 2024-07-10 10:38:39
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=510,M=5010;
const double eps=1e-8;
int n,m;
int w[N];
int g[N][N];
int sum[N];
int wsum,vsum;
bool judge(double val)
{
    double ws=val*wsum;
    double vs=vsum;
    bool mark[N]={0};
    bool flagg=1;
    while(1)
    {
        if(vs>ws+eps)
        {
            return 1;
        }
        bool flag=1;
        for(int i=1;i<=n;i++)
        {
            if(mark[i]) continue;
            double x=sum[i];
            if(!flagg)
            {
                for(int j=1;j<=n;j++)
                {
                    if(mark[j]) x-=g[i][j];
                }
            }
            if(x<w[i]*val)
            {
                ws-=w[i]*val;
                vs-=sum[i];
                mark[i]=1;
                flag=0;
                flagg=1;
                break;
            }
        }
        if(flag)
        {
            return 0;
        }
    }
}
int main()
{
    freopen("asiram.in","r",stdin);
    freopen("asiram.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&w[i]);
        wsum+=w[i];
    }
    for(int i=1;i<=m;i++)
    {
        int a,b,v;
        scanf("%d%d%d",&a,&b,&v);
        g[a][b]+=v;
        sum[a]+=v;
        sum[b]+=v;
        vsum+=v;
    }
    double l=0,r=10000;
    while(l+eps<r)
    {
        double mid=(l+r)/2;
        if(judge(mid)) l=mid;
        else r=mid;
    }
    printf("%.10lf",l);
    return 0;
}