ZJOI2013 防守战线
題目
戰線可以看作一個長度為\(n\)的序列,現在需要在這個序列上建塔來防守敵兵,在序列第\(i\)號位置上建一座塔有\(C_i\)的花費,且一個位置可以建任意多的塔,費用累加計算。有\(m\)個區間\([L_1,R_1],[L_2,R_2],…,[L_m,R_m]\),在第\(i\)個區間的范圍內要建至少\(D_i\)座塔。求最少花費。
算法1——費用流
我們會發現這題很像Noi2008 志愿者招募。
但是兩式相減之后卻不能產生想[志愿者招募]一樣的效果,原因是對于一個區間,它體現在矩陣里面的系數不是在同一列,而是在同一行。
有個神奇的東西,就是轉換成這個問題的對偶問題。對偶問題怎么轉換呢,鏈接。
對于原問題 可以描述為:
有一個工廠,它生產\(n\)種產品,第\(i\)種產品可以賣\(c_i\)元
現在一共有\(m\)種材料 生產一個產品\(i\)需要\(a_{ij}\)個材料\(j\)
每個材料的個數有上限 為\(b_i\)
現在要求一種生產方案使得獲利最多
這個問題的對偶問題 可以描述為:
你現在要找這個工廠購買原材料 第\(i\)種材料需要\(b_i\)個 價格由你定
這個工廠會把材料賣給你 僅當它覺得不虧
即它把賣給你的材料拿去做產品的價值\(\leq\)你收購做這個產品所需材料的價格和
求最少需要多少錢可以收購完
我覺得這個“證明”好形象!
然后我們就可以像[志愿者招募]一樣構圖,接著用跑費用流了,但是最“原始”的費用流會被卡掉\(3\)個點,所以我們要用\(zkw\)網絡流!
一開始我有點擔心圖中會不會出現正圈,lzh教導我:如果原圖沒有正圈,那么殘余網絡中也不會有正圈!
算法2——單純形
這個單純形,我弄了一整個早上才明白。
這里是維基的資料。
關于單純形,什么時候我們能跑整數的呢(在這題里面,矩陣里的元素只有\(-1,0,1\))?想到省賽就要來了,先把這個問題放一放。貼吧里有個帖子就是討論這個的。
貼個代碼,雖然不需要用double,但我還是先寫個標準的單純形吧。
#include <cstdio> #include <cmath> #include <iostream> #include <assert.h> using namespace std;const int MAXN = 1003; const int MAXM = 10003; const double INF = 1e100; const double EPS = 1e-8;int n, m; double A[MAXN][MAXM]; int main() {freopen("defend.in", "r", stdin);freopen("defend.out", "w", stdout);scanf("%d%d", &n, &m);n ++, m ++;for (int i = 1; i < n; i ++) {scanf("%lf", A[i] + m);}for (int i = 1; i < m; i ++) {int L, R;scanf("%d%d%lf", &L, &R, A[n] + i);for (int j = L; j <= R; j ++)A[j][i] = 1;}while (true) {int x = -1, y;for (int i = 1; i < m; i ++) {if (A[n][i] - EPS <= 0) continue;x = i;y = -1;double tval = INF;for (int j = 1; j < n; j ++) {if (A[j][i] - EPS <= 0) continue;double tmp = A[j][m] / A[j][i];if (tmp < tval) {tval = tmp;y = j;}}assert(y != -1);break;}if (x == -1) break;for (int i = 1; i <= m; i ++)if (i != x) A[y][i] /= A[y][x];A[y][x] = (double) 1 / A[y][x];for (int i = 1; i <= n; i ++)if (fabs(A[i][x]) > EPS)for (int j = 1; j <= m; j ++)if (i != y && j != x)A[i][j] -= A[i][x] * A[y][j];for (int i = 1; i <= n; i ++)if (i != y) A[i][x] *= - A[y][x];}printf("%.0lf\n", (double) - A[n][m]);return 0; }轉載于:https://www.cnblogs.com/wangck/p/4463517.html
總結
以上是生活随笔為你收集整理的ZJOI2013 防守战线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery文本折叠
- 下一篇: Oracle 12c In-Memory