51NOD 1821 最優集合 棧

2022-04-17 01:16:13 字數 1522 閱讀 8786

1821 最優集合

乙個集合s的優美值定義為:最大的x,滿足對於任意i∈[1,x],都存在乙個s的子集s',使得s'中元素之和為i。

給定n個集合,對於每一次詢問,指定乙個集合s1和乙個集合s2,以及乙個數k,要求選擇乙個s2的子集s3(|s3|<=k),使得s1∪s3的優美值最大。

(集合元素可以重複)

input

第一行乙個數n,(n<=1000)

接下來n行,每行描述乙個集合:

第乙個數m,表示集合大小,接下來m個數,表示集合中的元素(m<=1000,元素<=10^9)

第n+2行乙個數t,表示詢問次數(t<=10000)

接下來t行,每行3個數a,b,k,表示指定第a個集合為s1,第b個集合為s2,k的意義如題(a<=n,b<=n,k<=100,000)

output

t行,每行乙個數,表示對應詢問所能達到的最大優美值
input示例

2

6 1 2 3 8 15 32

6 1 1 1 1 1 1

11 2 3

output示例

64

#includeusing

namespace

std;

#pragma comment(linker, "/stack:102400000,102400000")

#define ls i<<1

#define rs ls | 1

#define mid ((ll+rr)>>1)

#define pii pair#define mp make_pairtypedef

long

long

ll;const

long

long inf = 1e18+1ll;

const

double pi = acos(-1.0

);const

int n = 1e3+10, maxn = 1e3+20, mod = 1e9+7, inf =2e9;

inta[n][n],n,t,b[n],h[n];

stack

q;void solve(int ii,int jj,int

k)

else

}for(int j = tmp1; j <= a[jj][0]; ++j)

else

break

; }

}while(!q.empty() &&k)

printf(

"%lld\n

",ans);

}int

main()

sort(a[i] + 1, a[i] + a[i][0] + 1

); }

scanf("%d

",&t);

while(t--)

return0;

}

最優集合 51Nod 1821

假設已選元素之和是sum 下乙個待選的數是val 只有當val sum 1時 才滿足選擇當前元素之後 1,sum val 內任意數都可以被已選元素表示 如果val sum 1 則 sum 1,val 1 都無法用已選元素表示 鬼谷子錢袋問題為什麼可以用二進位制 就是因為二進位制是滿足上述條件的所有方...

51NOD 1821 最優集合 並查集

傳送門 題意 乙個集合s的優美值定義為 最大的x,滿足對於任意i 1,x 都存在乙個s的子集s 使得s 中元素之和為i。給定n個集合,對於每一次詢問,指定乙個集合s1和乙個集合s2,以及乙個數k,要求選擇乙個s2的子集s3 s3 k 使得s1 s3的優美值最大。集合元素可以重複 n,m le 100...

51nod 最小集合

最小集合 system message 命題人 基準時間限制 1 秒 空間限制 131072 kb 分值 80 a君有乙個集合。這個集合有個神奇的性質。若x,y屬於該集合,那麼x與y的最大公因數也屬於該集合。但是他忘了這個集合中原先有哪些數字。不過幸運的是,他記起了其中n個數字。當然,或許會因為過度...