天津 app开发公司seo快速工具
天津 app开发公司,seo快速工具,落实20条优化措施,黄冈做学生互评的网站NC14732 锁
题意#xff1a;
n个居民#xff0c;门上有k把锁#xff0c;每个居民有若干钥匙#xff0c;为1到k的一个子集#xff0c;如果几名居民的钥匙的并集是1到k#xff0c;即他们拥有全部锁的对应钥匙。 求最小的k#xff0c;使得可以适当地给居民们每人若干钥匙…NC14732 锁
题意
n个居民门上有k把锁每个居民有若干钥匙为1到k的一个子集如果几名居民的钥匙的并集是1到k即他们拥有全部锁的对应钥匙。 求最小的k使得可以适当地给居民们每人若干钥匙(即一个1到k的子集)使得任意重要度之和小于m的居民集合持有的钥匙的并集不是1到k而任意重要度之和大于等于m的居民集合持有的钥匙的并集是1到k
题解
思路很妙 很明显是状压 我的思路一开始都跑偏了我想的是枚举每个人拥有的钥匙状态但是钥匙的数量是未知的 我们这样想 重要度不足m的不能开门大于m的一定能开门对于一个状态ii表示包含一些人但是重要度不足m的状态当再加入任意一个人x后就会超过m说明x含有的钥匙是状态i没有的所以问题就是求有多少个这样的状态i 对于当前状态(小于m)判断是否对于每个人而言加上他都是可以大于m如果可以就算一个答案只要存在一个人加上他也不满足那此状态作废 这个讲得透彻
代码
#includebits/stdc.h
using namespace std;
typedef long long ll;
ll a[30];
ll ans0;
ll n,m;int main ()
{scanf(%lld%lld,n,m);for(int i0;in;i) scanf(%lld,a[i]);for(int i0;i(1n);i){ll lo0;for(int j0;jn;j) if(i(1j)) loa[j];if(lom) continue;bool flagtrue;for(int j0;jn;j) if(!(i(1j)))//当前状态没有第j个人 if(loa[j]m) flagfalse;if(flag) ans;}printf(%lld\n,ans);
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87454.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!