NC14732 锁
NC14732 鎖
題意:
n個居民,門上有k把鎖,每個居民有若干鑰匙,為1到k的一個子集,如果幾名居民的鑰匙的并集是1到k,即他們擁有全部鎖的對應鑰匙。
求最小的k,使得可以適當地給居民們每人若干鑰匙(即一個1到k的子集),使得任意重要度之和小于m的居民集合持有的鑰匙的并集不是1到k,而任意重要度之和大于等于m的居民集合持有的鑰匙的并集是1到k
題解:
思路很妙
很明顯是狀壓
我的思路一開始都跑偏了,我想的是枚舉每個人擁有的鑰匙狀態,但是鑰匙的數量是未知的
我們這樣想:
重要度不足m的不能開門,大于m的一定能開門,對于一個狀態i,i表示包含一些人但是重要度不足m的狀態,當再加入任意一個人x后,就會超過m,說明x含有的鑰匙是狀態i沒有的,所以問題就是求有多少個這樣的狀態i
對于當前狀態(小于m),判斷是否對于每個人而言加上他都是可以大于m,如果可以就算一個答案,只要存在一個人加上他也不滿足,那此狀態作廢
這個講得透徹
代碼:
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll a[30]; ll ans=0; ll n,m;int main () {scanf("%lld%lld",&n,&m);for(int i=0;i<n;i++) scanf("%lld",&a[i]);for(int i=0;i<(1<<n);i++){ll lo=0;for(int j=0;j<n;j++) if(i&(1<<j)) lo+=a[j];if(lo>=m) continue;bool flag=true;for(int j=0;j<n;j++) if(!(i&(1<<j)))//當前狀態沒有第j個人 if(lo+a[j]<m) flag=false;if(flag) ans++;}printf("%lld\n",ans); } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 正露丸的功效与作用
- 下一篇: ICPC2019南昌区域赛