记录编号 285174 评测结果 AAAAAAAA
题目名称 软件补丁 最终得分 100
用户昵称 GravatarTenderRun 是否通过 通过
代码语言 C++ 运行时间 0.008 s
提交时间 2016-07-21 09:19:13 内存使用 0.34 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <map>
using namespace std;
const int maxn=110;
const int INF=1000000000;
map<int,bool>vis;
map<int,int>dis;
int n,m,val[maxn];
char op[maxn][maxn];
char tp[maxn][maxn];
queue<int>q;
int main(){
	freopen("bugs.in","r",stdin);
	freopen("bugs.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d",&val[i]);
		scanf("%s",op[i]+1);
		scanf("%s",tp[i]+1);
	}
	
	q.push(0);vis[0]=1;
	while(!q.empty()){
		int x=q.front();
		q.pop();vis[x]=0;
		for(int t=1;t<=m;t++){
			int f=1;
			for(int i=1;i<=n;i++)
				if(!(x>>i-1&1)&&op[t][i]=='-'||x>>i-1&1&&op[t][i]=='+'){f=0;break;}
					
			if(f==0)continue;
			int y=x;
			for(int i=1;i<=n;i++){
				if(tp[t][i]=='+')y&=((1<<n)-1)^(1<<(i-1));
				if(tp[t][i]=='-')y|=1<<(i-1);
			}	
			if(dis[y]==0&&y)dis[y]=INF;
			if(dis[x]+val[t]<dis[y]){
				dis[y]=dis[x]+val[t];
				if(!vis[y]){
					q.push(y);
					vis[y]=1;
				}
			}
		}
	}
	if(dis[(1<<n)-1]!=0)
		printf("%d\n",dis[(1<<n)-1]);
	else printf("-1\n");	
	return 0;
}