洛谷P3231 消毒 列舉 最小點覆蓋

2021-09-26 18:57:04 字數 1308 閱讀 4924

給出乙個a×b

×c

≤5000

a×b×c\leq5000

a×b×c≤

5000

的立體,其中有一些方塊被打上標記,你每次可以選擇x×y

×z

x×y×z

x×y×

z的方塊,並且消去其中所有打上標記的點,而花費的代價是min

min\

min,求問最少的花費把所有的標記的點全部消掉。

考慮二維平面的問題,一定是分割為若干個1×b

1×b1×

b和1×

c1×c

1×c的條狀是最好的,構造乙個二分圖:左邊代表行,右邊代表列,對每個點就在行和列之間連邊。然後要求的就是乙個最小點覆蓋,而最小點覆蓋等於最大匹配。

再考慮三維的情形,由於a×b

×c

≤5000

a×b×c\leq5000

a×b×c≤

5000

,m in

≤5000

3min\\leq\sqrt[3]

min≤35

000​

,所以只要按照最小的那一維暴力列舉,列舉到的這一面直接花費1

11的代價刪除。

#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const ll inf=long_long_max;

const int n=5e3+7;

int x[n],y[n],z[n];

vectorg[n];

int a,b,c,tot=0;

bool vis[n];

int used[n],link[n];

int tim=0;

int dfs(int u)

} return 0;

}int solve(int val)

int add=0;

for(int i=0;ifor(int i=1;i<=tot;i++)

} for(int i=1;i<=b;i++)

return add;

}int main() }}

} if(b==mi)

else if(c==mi)

int ans=2e9;

for(int i=0;i<(1

printf("%d\n",ans);

} return 0;

}

洛谷P1576 最小花費

在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後b收到100元。輸入格式 第一行輸入兩個正整數n,m,分別表示總人數和可以互相轉賬的人的對數。以下m行每行輸入三個正整數x,y,z,表...

洛谷 P2085 最小函式值

有n個函式,分別為f1,f2,fn。定義fi x ai x 2 bi x ci x n 給定這些ai bi和ci,請求出所有函式的所有函式值中最小的m個 如有重複的要輸出多個 輸入格式 輸入資料 第一行輸入兩個正整數n和m。以下n行每行三個正整數,其中第i行的三個數分別位ai bi和ci。ai 10...

最小密度路徑 洛谷p1730

給出一張有n個點m條邊的加權有向無環圖,接下來有q個詢問,每個詢問包括2個節點x和y,要求算出從x到y的一條路徑,使得密度最小 密度的定義為,路徑上邊的權值和除以邊的數量 輸入格式 第一行包括2個整數n和m。以下m行,每行三個數字a b w,表示從a到b有一條權值為w的有向邊。再下一行有乙個整數q。...