1. 程式人生 > >bzoj 1061 [Noi2008]志願者招募 單純形演算法

bzoj 1061 [Noi2008]志願者招募 單純形演算法

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
HINT

1 ≤ N ≤ 1000,1 ≤ M ≤ 10000,題目中其他所涉及的資料均 不超過2^31-1。



傳送門
似乎是裸的線性規劃……

然而一開始不會啊QAQ
先想了個比較明顯的……假如第i個志願者在第j天工作,
那麼係數矩陣a[j][i]=1,然後矩陣裡對應一下……
於是樣例就是這樣的一個線性規劃:
minimize:2x1+5x2+2x3satisfy:x11+x20+x30>=2x11+x21+x30>=3x10+x21+x31>=4
結果……我靠既不是求max又不是小於等於!
幸好記得以前看到過這個的對偶問題……好像怎樣弄一下就直接好了?
……似乎是把係數矩陣帶著要求的值和答案的係數,一起翻轉一下?
這個翻轉……就是YY一下左上右下反過來(唔……)
那麼樣例就變成了:
m

aximize:2x1+3x2+4x3satisfy:x11+x21+x30<=2x10+x21+x31<=5x10+x20+x31<=2
然後就對啦。。後來知道了這個東西叫做矩陣的轉置。。
轉置是啥……問度娘吧!舉個簡單的例子,就是:
123456T=[142536]
看上去就這麼解決了,但是我們忘記了一個很重要的東西?……
沒錯……這題裡的值得是整數啊!這不是整數線性規劃嗎?NP?
我當時就糾結了很久。。這樣就不能用單純形了啊。。
然後就各種百度……終於發現了這麼一個東西叫做“么模矩陣”
還有一句話“係數矩陣全為0,1或者-1的,一定有至少一組最優解全為整數”
……似乎還有行列式的說法更正式一點……
數學這東西我真的不好啊QAQ


線性規劃第二題1A了(除掉手殘陣列開反2次)很開心=v=

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const double 
    eps=1e-8;
int n,m;
double a[10005][1005];
void pivot(int l,int e){
    double x=a[l][e];a[l][e]=1.0;
    for (int i=0;i<=m;i++) a[l][i]/=x;
    for (int i=0;i<=n;i++)
        if (i!=l && fabs(a[i][e])>eps){
            x=a[i][e],a[i][e]=0.0;
            for (int j=0;j<=m;j++) a[i][j]-=x*a[l][j];
        }
}
double Simplex(){
    while (1){
        int x=0,y=0;
        for (int i=1;i<=m;i++)
            if (a[0][i]>eps){y=i;break;}
        if (!y) break;
        double t=1e15;
        for (int i=1;i<=n;i++)
            if (a[i][y]>eps && a[i][0]/a[i][y]<t)
                t=a[i][0]/a[i][y],x=i;
        if (!x) return -1;
        pivot(x,y);
    }
    return -a[0][0];
}
int main(){
    scanf("%d%d",&m,&n);
    for (int i=1;i<=m;i++) scanf("%lf",&a[0][i]);
    int x,y;
    for (int i=1;i<=n;i++){
        scanf("%d%d%lf",&x,&y,&a[i][0]);
        for (int j=x;j<=y;j++) a[i][j]=1.0;
    }
    printf("%.0lf\n",Simplex());
    return 0;
}

相關推薦

bzoj 1061 [Noi2008]志願者招募 單純演算法

Description   申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了一個難 題:為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要N

BZOJ1061: [Noi2008]志願者招募 && 單純學習筆記

題目 題解 終於搞完了單純形,還真不是個簡單的東西,但是理解之後,演算法挺簡單的,證明只有自動略過了qwq。 學習單純形推薦算導29章,嚴密又不失詳細。 標準的線性規劃式子是,A=(aij),b=(bi),c=(ci),x=(xi) 大小的話A

BZOJ 1061 [Noi2008]志願者招募 線性規劃

題意:連結 方法:線性規劃 解析: 不妨對樣例加以闡釋 3 3 2 3 4 1 2 2 2 3 5 3 3 2 不妨設Xi代表第i種志願者選Xi個人 那麼顯然,這題的限制為 X1>

[BZOJ]4842: [Neerc2016]Delight for a Cat 1061: [Noi2008]志願者招募 費用流 線性規劃

題解: 把這兩道題目放在一起寫,因為做法是一樣的。 兩題都是經典的線性規劃問題,但同時也都可以用費用流解決。 以志願者招募這題為例,首先設第 i

BZOJ 10611061: [Noi2008]志願者招募 (線性規劃與網路流)**

1061: [Noi2008]志願者招募 Description   申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了一個難 題:為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要N 天才能完成,其中第i 天至少需要 Ai 個人。 布布通過了解得知

【BZOJ1061】[Noi2008]志願者招募單純法】

雙倍經驗題,BZOJ3265。 先用對偶原則轉換成求對偶問題的解,這樣直接轉化成了標準型,然後跑Simplex就好了。 下面是對樣例的一個計算過程。 /* Footprints In The

[BZOJ1061][NOI2008]志願者招募(費用流神題單純裸題)

題目描述 傳送門 題解 關於費用流的神建圖我無言以對。 轉自神犇的部落格:https://www.byvoid.com/blog/noi-2008-employee/ 關於單純形。。。裸題

BZOJ 1061】 [Noi2008]志願者招募

1061: [Noi2008]志願者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 2066  Solved: 1282 [Submit][Status] Description 申奧成功後,布布經過不懈努力,終於

[NOI2008]志願者招募,洛谷P3980,線性規劃對偶定理以及整數解

正題       題目連結       這一題很容易構造一個線性規劃的模型。       對於每一天,在這一天的志願者的總和大於等於需要的人數,最小化每種志願者乘其單價費用的和。  

線性規劃網路流 :工廠最大效益——單純演算法【超詳+題解】

問題:某食品加工廠一共有三個車間,第一車間用 1 個單位的原料 N 可以加工 5 個單位的產品 A 或 2 個單位的產品 B。產品 A 如果直接售出,售價為 10 元,如果在第二車間繼續加工,則需要額外加工費 5 元,加工後售價為 19 元。產品 B 如果直接售出,售價 16

線性規劃專題——SIMPLEX 單純演算法(二)

前言 線性規劃專題——SIMPLEX 單純形演算法(一) 提到了在線性規劃問題的以下結論: 問題的所有可行解構成了一個n-m維度的多胞型 而且最優解會在多胞型的頂點取得。 每個頂點對著係數矩陣的一組基,或者係數矩陣的每組基對應著一個頂點。 同時我們給出了

線性規劃專題——SIMPLEX 單純演算法(一)

線性規劃,以前一直小瞧它了,它其實一種特別表達能力特別強的工具,只要能夠將問題定義成線性規劃的問題,那麼就可以使用單純形法來解決。 為什麼說,線性規劃的表達能力很強呢?因為像經典的網路流演算法、最小費用流演算法、多物品流演算法都可以寫成線性規劃的形式,一旦劃歸成線性規劃,那麼就可以使

線性規劃專題——SIMPLEX 單純演算法(四)——實現

實現的原理見: 線性規劃專題——SIMPLEX 單純形演算法(一) 線性規劃專題——SIMPLEX 單純形演算法(二) 線性規劃專題——SIMPLEX 單純形演算法(三)——示例、注意點 實現過程 重點是實現PIVOT 指定主元的高斯約旦消元,以及INITICIALSIMPLEX

bzoj1061 [Noi2008]志願者招募(網路流解決線性規劃問題)

bzoj1061 [Noi2008]志願者招募 題意: 一個專案需要N 天才能完成,其中第i 天至少需要Ai 個人。一共有M 類志願者可以招募。其中第i 類可以從第Si 天工作到第Ti 天,招募

·完整·單純演算法(Simplex Algorithm),附C原始碼

前段時間參加了華為的2017軟體精英挑戰賽,用到了單純形演算法求解線性規劃問題,學習了正單純形,對偶單純形以及割平面法並用C語言實現了完整的simplex演算法。 單純形演算法是用來求解線性規劃問題的,其被用在了眾多SMT Solver中,如Yices, Z3

bzoj1061 [Noi2008]志願者招募(線性規劃/費用流)

這題太神了!但是聽說是單純形法求解線性規劃裸題???看樣子網路流和線性規劃有著莫大的聯絡啊,待研究。 此題基本就是用網路流求解了一個等式的最優解? 附上大神題解:https://www.byvoid

洛谷 P3980 [NOI2008]志願者招募 費用流

題目描述 申奧成功後,布布經過不懈努力,終於成為奧組委下屬公司人力資源部門的主管。布布剛上任就遇到了一個難題:為即將啟動的奧運新專案招募一批短期志願者。經過估算,這個專案需要N 天才能完成,其中第i 天至少需要Ai 個人。 布布通過了解得知,一共有M 類志願者

【bzoj1061】[Noi2008]志願者招募

= =跟上一道基本相同,可以單純形法解線性規劃,也可以費用流. 寫費用流的話建圖就是一般的線性規劃轉費用流的套路,加上基變數,然後化成等式,每個下式減上式之後可以化成表示流量平衡的等式,然後根據等式建圖就好了,跑一個最小費用最大流. 寫單純形沒有寫網路流好理

[BZOJ1061][NOI2008]志願者招募 費用流

/************************************************************** Problem: 1061 User: di4CoveRy Language: C++ Resul

bzoj1061: [Noi2008]志願者招募 費用流

首先貼個線性規劃原問題模型: max c1x1+c2x2+...cnxn 約束條件 ai1x1+ai2x2+...ainxn>=bi ai1x1+ai2x2+...ainxn=bi ai1x1+ai2x2+...ainxn<=bi ai1x1+ai2x2+...