1821 最優集合
乙個集合s的優美值定義為:最大的x,滿足對於任意i∈[1,x],都存在乙個s的子集s',使得s'中元素之和為i。
給定n個集合,對於每一次詢問,指定乙個集合s1和乙個集合s2,以及乙個數k,要求選擇乙個s2的子集s3(|s3|<=k),使得s1∪s3的優美值最大。
(集合元素可以重複)
input
第一行乙個數n,(n<=1000)output接下來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)
t行,每行乙個數,表示對應詢問所能達到的最大優美值input示例
2output示例6 1 2 3 8 15 32
6 1 1 1 1 1 1
11 2 3
64
#includeusingnamespace
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個數字。當然,或許會因為過度...