沒有標籤是因為我真的不知道這算什麼型別
這題我說不來大意你們還是看題面描述吧
小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 的資料。這題其實挺簡單的,把圖的點雙求出來之...