假設已選元素之和是sum 下乙個待選的數是val 只有當val<=sum+1時 才滿足選擇當前元素之後[1,sum+val]內任意數都可以被已選元素表示 如果val>sum+1 則[sum+1,val-1]都無法用已選元素表示
鬼谷子錢袋問題為什麼可以用二進位制 就是因為二進位制是滿足上述條件的所有方法中最優的
具體實現就是掃集合a 當a[i]<=sum+1時就加上接著走 不然就在b集合裡找[1,sum+1]內最大的未被選的數 並查集維護一下即可
#include using namespace std;
typedef long long ll;
const int maxn=1e3+10;
ll val[maxn][maxn];
int len[maxn],f[maxn];
int n,q;
int getf(int p)
void unite(int u,int v)
template inline void _cin(t &ret)
}int main()
sort(val[i]+1,val[i]+len[i]+1);
}//scanf("%d",&q);
_cin(q);
while(q--)
}if(i==len[a]+1)
}printf("%lld\n",sum);
}return 0;}/*
26 1 3 4 4 7 8
5 1 2 3 4 5
101 2 3
*/
51NOD 1821 最優集合 棧
1821 最優集合 乙個集合s的優美值定義為 最大的x,滿足對於任意i 1,x 都存在乙個s的子集s 使得s 中元素之和為i。給定n個集合,對於每一次詢問,指定乙個集合s1和乙個集合s2,以及乙個數k,要求選擇乙個s2的子集s3 s3 k 使得s1 s3的優美值最大。集合元素可以重複 input 第...
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個數字。當然,或許會因為過度...