zoukankan      html  css  js  c++  java
  • BZOJ 3265 志愿者招募加强版(单纯形)

    3265: 志愿者招募加强版

    Time Limit: 20 Sec  Memory Limit: 512 MB
    Submit: 848  Solved: 436
    [Submit][Status][Discuss]

    Description

    Input

    Output

    Sample Input

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

    Sample Output

    14

    HINT

    题解:这一题类似于BZOJ1061,(几乎相同,只是把一段连续区间改为几段连续区间而已),做法一样,单纯形模板直接套就行;
    具体看代码:
     
    参考代码:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define cls(x, val) memset(x,val,sizeof(x))
     4 #define RI register int
     5 #define eps 1e-6
     6 typedef long long ll;
     7 typedef unsigned long long ull;
     8 const int INF=0x3f3f3f3f;
     9 inline int read()
    10 {
    11     int x=0,f=1;char ch=getchar();
    12     while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
    13     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    14     return x*f;
    15 }
    16 const int N=1005;
    17 const int M=10005;
    18 int n,m;
    19 double a[M][N],b[M],c[M],v;
    20 inline void pivot(int l,int e)//矩阵的转秩
    21 {
    22     b[l]/=a[l][e];
    23     for(int j=1;j<=n;++j)
    24     {
    25         if(j!=e) a[l][j]/=a[l][e];        
    26     }
    27     a[l][e]=1/a[l][e];
    28     for(int i=1;i<=m;++i)
    29     {
    30         if(i!=l&&fabs(a[i][e])>0)
    31         {
    32             b[i]-=a[i][e]*b[l];
    33             for(int j=1;j<=n;++j)
    34             {
    35                 if(j!=e) a[i][j]-=a[i][e]*a[l][j];
    36             }
    37             a[i][e]=-a[i][e]*a[l][e];
    38         }
    39     }
    40     v+=c[e]*b[l];
    41     for(int j=1;j<=n;++j)
    42     {
    43         if(j!=e) c[j]-=c[e]*a[l][j];
    44     }
    45     c[e]=-c[e]*a[l][e];
    46 }
    47 
    48 inline double simplex()
    49 {
    50     while(1)
    51     {
    52         int e=0,l=0;
    53         for(e=1;e<=n;++e)
    54         {
    55             if(c[e]>eps) break;
    56         }
    57         if(e==n+1) return v;
    58         double mn=INF;
    59         for(int i=1;i<=m;++i)
    60         {
    61             if(a[i][e]>eps&&mn>b[i]/a[i][e]) mn=b[i]/a[i][e],l=i;
    62         }
    63         if(mn==INF) return INF;
    64         pivot(l,e);
    65     }
    66 }
    67 
    68 int main()
    69 {
    70     n=read(),m=read();
    71     for(RI i=1;i<=n;++i) c[i]=read();
    72     for(RI i=1;i<=m;++i)
    73     {
    74         RI k=read();
    75         while(k--)
    76         {
    77             int s,t;
    78             s=read(),t=read();
    79             for(RI j=s;j<=t;++j) a[i][j]=1.0;
    80         }
    81         b[i]=read();
    82     }
    83     printf("%d
    ",(int)(simplex()+0.5));
    84     return 0;
    85 } 
    View Code
  • 相关阅读:
    BZOJ 1040 (ZJOI 2008) 骑士
    BZOJ 1037 (ZJOI 2008) 生日聚会
    ZJOI 2006 物流运输 bzoj1003
    ZJOI 2006 物流运输 bzoj1003
    NOI2001 炮兵阵地 洛谷2704
    NOI2001 炮兵阵地 洛谷2704
    JLOI 2013 卡牌游戏 bzoj3191
    JLOI 2013 卡牌游戏 bzoj3191
    Noip 2012 day2t1 同余方程
    bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
  • 原文地址:https://www.cnblogs.com/csushl/p/10013346.html
Copyright © 2011-2022 走看看