日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NC14732 锁

發布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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); } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的NC14732 锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。