Wannafly挑戰賽6 D 鎖

2021-08-14 05:32:37 字數 1262 閱讀 4822

時間限制: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...