時間限制:c/c++ 1秒,其他語言2秒
空間限制:c/c++ 131072k,其他語言262144k
64bit io format: %lld
題目描述
106號房間共有n名居民, 他們每人有乙個重要度。房間的門上可以裝若干把鎖。假設共有k把鎖,命名為1到k。每把鎖有一種對應的鑰匙,也用1到k表示。鑰匙可以複製並發給任意多個居民。每個106房間的居民持有若干鑰匙,也就是1到k的乙個子集。如果幾名居民的鑰匙的並集是1到k,即他們擁有全部鎖的對應鑰匙,他們都在場時就能開啟房門。新的陸戰協定規定,一組居民都在場時能開啟房門當且僅當他們的重要度加起來至少為m。問至少需要給106號房間裝多少把鎖。即,求最小的k,使得可以適當地給居民們每人若干鑰匙(即乙個1到k的子集),使得任意重要度之和小於m的居民集合持有的鑰匙的並集不是1到k,而任意重要度之和大於等於m的居民集合持有的鑰匙的並集是1到k。
輸入描述:
第一行兩個整數n和m,0< n< 21,0< m< 1000000001。
第二行n個整數表示居民們的重要度。
重要度在[1,1000000000]之間。
輸出描述:
乙個整數表示最少需要多少把鎖。
示例1
輸入 4 3
1 1 1 1
輸出 6
說明:
106號房共有4名居民,只有3人在場時才能開啟門。這時共需6把鎖。
題意:題意很好理解,但是樣例卻沒這麼容易理解。看了半天。
如果有6把鎖,第乙個人拿,第二個人拿,第三個人拿,第四個人拿,可以驗證任意兩個人都加起來都湊不齊1-6所有的鑰匙,但任意三個人都加起來都可以湊齊1-6所有的鑰匙。
思路:重要度不足m的不能開門,超過m的一定能開門。只需要保證缺一把鑰匙,並且,每個組合缺的鑰匙不一樣。如果組合是一樣的,加起來重要度大於m但是卻無法開門,所以要排除這種情況的話,就需要每個組合缺的鑰匙不一樣。
對於當前狀態(小於m),判斷接下是不是對於每個人而言加上他都可以大於m,如果可以,就是一種情況(ans++)。
十分玄妙的n<21,可以直接狀態壓縮。
#include
using
namespace
std;
typedef
long
long ll;
ll a[30];
ll ans=0;
ll n,m;
int main ()
printf("%lld\n",ans);
}
Wannafly挑戰賽6 鎖
106號房間共有n名居民,他們每人有乙個重要度。房間的門上可以裝若干把鎖。假設共有k把鎖,命名為1到k。每把鎖有一種對應的鑰匙,也用1到k表示。鑰匙可以複製並發給任意多個居民。每個106房間的居民持有若干鑰匙,也就是1到k的乙個子集。如果幾名居民的鑰匙的並集是1到k,即他們擁有全部鎖的對應鑰匙,他們...
Wannafly挑戰賽16 D 打怪(DP)
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 有a種 b種屬性,和c種怪物。對於第k種怪物,給出 i和屬性j的搭配在乙個單位時間內對其造成的傷害h k,i,j。已知一開始使用 i,需要時間x i,使用屬性i,需...
Wannafly挑戰賽20 D挑選隊友
d 挑選隊友 進入討論 77 304 通過輸入包括兩行 第一行包括三個數n,m,k,表示共有n位選手,m個群,需要有k名選手被選擇 第二行包括m個數,第i個數表示第i個群有si個選手 n 100000,m k n 輸出包括一行 第一行輸出方案數 由於輸出可能比較大,你只需要輸出在模998244353...