校內模擬 鎖

2021-09-11 18:28:56 字數 1687 閱讀 7828

沒有標籤是因為我真的不知道這算什麼型別

這題我說不來大意你們還是看題面描述吧

小z住的房子一共有n個人,他們每人有乙個重要度。

房子的門上可以裝若干把鎖。

假設共有k把鎖,命名為1到k。每把鎖有一種對應的鑰匙,也用1到k表示。

鑰匙可以複製若干份並發給任意多個居民。每個人都可以持有若干鑰匙,可以不持有鑰匙。

如果幾名居民鑰匙的並集是全集,他們都在場時就能開啟房門。

房東規定,一組居民都在場時能開啟房門當且僅當他們的重要度加起來至少為m。

問至少需要給房間裝多少把鎖。即,求最小的k,使得可以適當地給居民們每人若干鑰匙,使得任意一組重要度之和小於m的居民持有的鑰匙不能開啟所有房門,使得任意一組重要度之和大於等於m的居民持有的鑰匙能開啟所有房門。

樣例輸入

4 31 1 1 1

樣例輸出

6對於前30%的測試資料,滿足所有ai=1。

對於另外30%的測試資料,1≤n≤8。

對於100%的測試資料,1≤n≤20,1≤m≤1e9,任意居民重要度≤m。

第一眼看不出來是什麼題。於是跑去做t3

看到20想了狀壓dp,但不知道該描述什麼狀態以及怎麼轉移。後來對著樣例手玩了20分鐘,終於第一次找到正確的方案(沒錯我樣例都看不懂),然後由於我畫出那個方案的方式非常特別,跟組合數學完全一致,於是用組合數過掉了前三十分。

30pts

公式就是cm−

1n

c_^n

cm−1n​

。至於原因……花二十分鐘畫出樣例找規律?

100pts

正解就是推理,看完之後恍然大悟。推理如下:

所以暴力一點跑個dfs就過去了~(當然這個dfs是可以優化的)

#include

#define rint register int

#define iint inline int

#define ivoid inline void

#define endll '\n'

#define ll long long

using

namespace std;

const

int n=

2e6+5;

const

int m=

3e3+5;

const

int inf=

0x3f3f3f3f

;int m,n,q,k,x,y,z,u,v,w,s,t,l,r;

ll a[21]

;int vis[21]

;int sum,cnt,ans,res,num,tot,mx;

iint rad()

while

(c>=

'0'&&c<=

'9')x=

(x<<3)

+(x<<1)

+c-'0'

,c=getchar()

;return x*f;

}ivoid dfs

(int x,ll sum)

ans++

;return;}

vis[x]=1

;dfs

(x+1

,sum+a[x]);

vis[x]=0

;dfs

(x+1

,sum);}

intmain()

校內模擬 assignment(DP)

題面見校內oj4693 考慮預處理f k i j f k i j f k i j 表示最長的一段不超過k kk的時候,將長度為i ii的序列分為j jj段的方案數。在k kk相同的狀態之間轉移,顯然有f i j f i 1 j f i 1 j 1 f i k 1 j 1 f i j f i 1 j ...

2019 10 03 校內模擬

內網傳送門 很明顯的乙個網路流。轉換一下題意,相當於求保留航線的最大值。所以我們把邊權取負跑最小費用流。有乙個坑點,就是我們只需要費用最小,不要求流量最大,所以不應該用最小費用最大流。有兩個解決辦法 用最小費用可行流。連 i,t,1,0 i,t,1,0 i,t,1 0 的邊,表示不選 i ii 連出...

2019 10 12 校內模擬

內網傳送門 今天考 noip 模擬,拿了 270 27027 0 分,我要膨脹了。主要還是運氣好,t3 做過原題,t2 算是某道題的弱化版,t1 推了個結論用 o n log 2n o n log 2n o nlog2n 水過了 106 10 6 106 的資料。這題其實挺簡單的,把圖的點雙求出來之...