• bzoj [Noi2008] 1061 志愿者招募 单纯形


    [Noi2008]志愿者招募

    Time Limit: 20 Sec  Memory Limit: 162 MB
    Submit: 5437  Solved: 3267
    [Submit][Status][Discuss]

    Description

      申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管。布布刚上任就遇到了一个难
    题:为即将启动的奥运新项目招募一批短期志愿者。经过估算,这个项目需要N 天才能完成,其中第i 天至少需要
    Ai 个人。 布布通过了解得知,一共有M 类志愿者可以招募。其中第i 类可以从第Si 天工作到第Ti 天,招募费用
    是每人Ci 元。新官上任三把火,为了出色地完成自己的工作,布布希望用尽量少的费用招募足够的志愿者,但这
    并不是他的特长!于是布布找到了你,希望你帮他设计一种最优的招募方案。

    Input

      第一行包含两个整数N, M,表示完成项目的天数和可以招募的志愿者的种类。 接下来的一行中包含N 个非负
    整数,表示每天至少需要的志愿者人数。 接下来的M 行中每行包含三个整数Si, Ti, Ci,含义如上文所述。为了
    方便起见,我们可以认为每类志愿者的数量都是无限多的。

    Output

      仅包含一个整数,表示你所设计的最优方案的总费用。

    Sample Input

    3 3
    2 3 4
    1 2 2
    2 3 5
    3 3 2

    Sample Output

    14

     http://blog.csdn.net/w_yqts/article/details/70838007?locationNum=6&fps=1

    https://www.cnblogs.com/juruolty/p/6276715.html//题解

    https://www.cnblogs.com/jianglangcaijin/p/3799759.html//费用流题解

     1 #pragma GCC optimize(2)
     2 #pragma G++ optimize(2)
     3 #include<cstring>
     4 #include<cmath>
     5 #include<iostream>
     6 #include<cstdio>
     7 #include<algorithm>
     8 
     9 #define inf 1000000007
    10 #define eps 0.000000001
    11 #define N 1007
    12 #define M 10007
    13 using namespace std;
    14 inline int read()
    15 {
    16     int x=0,f=1;char ch=getchar();
    17     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    18     while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    19     return x*f;
    20 }
    21 
    22 int n,m;
    23 double a[M][N],b[M],c[N],ans;
    24 
    25 inline void pivot(int l,int e)
    26 {
    27     b[l]/=a[l][e];
    28     for (int i=1;i<=n;i++)if(i!=e)a[l][i]/=a[l][e];
    29     a[l][e]=1/a[l][e];
    30     for (int i=1;i<=m;i++)
    31         if(i!=l&&abs(a[i][e])>eps)
    32         {
    33             b[i]-=a[i][e]*b[l];
    34             for (int j=1;j<=n;j++)
    35                 if(j!=e)a[i][j]-=a[i][e]*a[l][j];
    36             a[i][e]=-a[i][e]*a[l][e];
    37         }
    38     ans+=c[e]*b[l];
    39     for (int i=1;i<=n;i++)
    40         if(i!=e)c[i]-=c[e]*a[l][i];
    41     c[e]=-c[e]*a[l][e];
    42 }
    43 inline void simplex()
    44 {
    45     int l,e;
    46     while(true)
    47     {
    48         for (e=1;e<=n;e++)
    49             if(c[e]>eps)break;
    50         if(e>n)break;
    51         double t=inf;
    52         for (int i=1;i<=m;i++)
    53             if(a[i][e]>eps&&b[i]/a[i][e]<t)
    54             {
    55                 t=b[i]/a[i][e];
    56                 l=i;
    57             }
    58         pivot(l,e);
    59     }
    60 }
    61 int main()
    62 {
    63     n=read(),m=read();
    64     for (int i=1;i<=n;i++)scanf("%lf",&c[i]);
    65     for (int i=1;i<=m;i++)
    66     {
    67         int x=read(),y=read();scanf("%lf",&b[i]);
    68         for (int j=x;j<=y;j++)a[i][j]++;
    69     }
    70     simplex();
    71     printf("%.0lf
    ",ans);
    72 }
  • 相关阅读:
    CSS样式
    Python宏观
    javaScript----------(函数)
    vue-----5计算属性
    python之函数作用域、嵌套以及闭包
    python之函数的定义、传参以及动态参数
    python之文件操作
    基础数据类型的补充以及深浅copy
    小数据池、代码块以及编码转换
    python基础二
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8530499.html
Copyright © 2020-2023  润新知