codevs 2218 [CTSC1999] 补丁vs错误 dfs+二进制
来源:互联网 发布:php在线订单系统源码 编辑:程序博客网 时间:2024/06/14 06:14
题目:
http://codevs.cn/problem/2218/
暴搜+剪枝;
x & ~ ( 1 << i ) : 将集合x中的元素i去除;
( x & i ) == i , 判断i是否为x的子集 ;
教训:
x=x&~ss[i].s4; x=x|ss[i].s3; dfs(tot+ss[i].tim,x); x=x|ss[i].s4;//可能把没减的也加上了; x=x&~ss[i].s3;
考虑用中间变量来解决;
(感谢loi_wzhd大佬 orz);
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int MAXN=101;int n,m,ans=2147483647;bool vis[400001];struct hh{ int tim,s1,s2,s3,s4;}ma[MAXN];void dfs(int tot,int x){ if(tot>=ans || vis[x]) return;//不加T五组,加了跑44ms; if(!x) {ans=tot;return;} vis[x]=1; for(int i=1;i<=m;i++) { int v; if( (ma[i].s1 & x)==ma[i].s1 && !(ma[i].s2 & x)) { v=x&~ma[i].s4,v|=ma[i].s3;//需要一个中间变量; dfs(tot+ma[i].tim,v); } } vis[x]=0; return;}void solve(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { string s1,s2; scanf("%d",&ma[i].tim); cin>>s1>>s2; for(int j=0;j<n;j++) { if(s1[j]=='+') ma[i].s1^=1<<j; else if(s1[j]=='-') ma[i].s2^=1<<j; } for(int j=0;j<n;j++) { if(s2[j]=='+') ma[i].s3^=1<<j; else if(s2[j]=='-') ma[i].s4^=1<<j; } } dfs(0,(1<<n)-1); cout<<(ans==2147483647?0:ans); return;}int main(){ solve(); return 0;}
阅读全文
1 0
- codevs 2218 [CTSC1999] 补丁vs错误 dfs+二进制
- CTSC1999补丁VS错误题解
- 【CTSC1999】 CODE[VS] 2218 补丁VS错误(状压最短路)
- 【CTSC1999】补丁vs错误 状压最短路
- codevs 2218 补丁vs错误
- 【codevs 2218】补丁vs错误(CTSC 1999)
- codevs 2218 补丁 vs 错误 (最短路)
- codevs 2218 补丁vs错误(状压搜索)
- codevs 2218 补丁vs错误(状压搜索)(luogu P1527)
- [CTSC99]补丁VS错误
- 补丁VS错误
- luogu1527补丁VS错误、luogu2716软件补丁问题
- 【状压bfs】ctsc 1999 补丁vs错误
- vijos1019:补丁VS错误——题解
- codevs2218 补丁vs错误 1999年CTSC国家队选拔赛[三星]
- codevs2218 补丁VS错误(状压+spfa更新)
- 对VS升级SP2补丁,出现错误 1718。 文件被数字签名策略拒绝错误的解决办法
- VS补丁相关
- 用户 'IIS APPPOOL\***' 登录失败的原因及两种解决办法
- rpm介绍
- 剑指offer:字符流中第一个不重复的字符
- PAT1026 程序运行时间
- Spring中BeanFactory和ApplicationContext的生命周期及其区别详解
- codevs 2218 [CTSC1999] 补丁vs错误 dfs+二进制
- XMl Schema校验
- 写一个简单docker运行命令
- 简单的正弦图和余弦图
- java中replace()和replaceAll()的区别
- 泛型
- OpenGL中对混合操作的实例演示
- [vijos1037]搭建双塔
- Hbase简单命令