//11162842 c00h00g 1029 Accepted 792K 47MS G++ 3378B 2013-01-07 10:35:07
//枚举每一个硬币是否有可能是false coin
//等号左右两边的数字肯定不是false coin,只需要枚举除此之外的硬币
//将大于号转化为小于号来处理
//WA 1次,原因:看下面这组数据,枚举1的时候并不能产生矛盾,因为没有处理这种情况,当假设1是false coin的时候,不能存在不等式且该不等式中1没有出现
//5 3
//2 1 3 2 4
//>
//2 3 5 2 4
//>
//1 1 4
//>
#include<cstdio>
#include<cstdlib>
#include<string.h>
//使用left[i][0]存储元素的个数
int left[105][505];
int right[105][505];
//0表示相等,1表示<,2表示>
int state[105];
int N,K;
int vis[1005];
int main(){
int i,j,k,coin;
char ch;
while(scanf("%d%d",&N,&K)!=EOF){
memset(vis,0,sizeof(vis));
for(i=1;i<=K;i++){
scanf("%d",&left[i][0]);
right[i][0]=left[i][0];
for(j=1;j<=left[i][0];j++){
scanf("%d",&coin);
left[i][j]=coin;
}
for(j=1;j<=right[i][0];j++){
scanf("%d",&coin);
right[i][j]=coin;
}
getchar();
scanf("%c",&ch);
if(ch=='='){
state[i]=0;
for(j=1;j<=left[i][0];j++)
vis[left[i][j]]=1;
for(j=1;j<=right[i][0];j++)
vis[right[i][j]]=1;
}
else if(ch=='<')
state[i]=1;
//将大于号转换为小于号
else{
for(j=1;j<=left[i][0];j++){
int tmp=left[i][j];
left[i][j]=right[i][j];
right[i][j]=tmp;
}
state[i]=1;
}
}
//开始枚举
int res_num,res=0;
for(i=1;i<=N;i++){
//不是相等中的一个,看看是否满足所有的式子
if(vis[i]==0){
//pos=1表示轻物体,pos=2表示重物体
int pos=-1;
bool flag=false;
for(j=1;j<=K;j++){
//如果是小于号的话
if(state[j]==1){
bool find_out=false;
//查看在左边还是右边
for(k=1;k<=left[j][0];k++){
if(left[j][k]==i){
find_out=true;
//在左边,但却是重物体,矛盾
if(pos==2)
flag=true;
if(pos==-1)
pos=1;
break;
}
}
if(flag) break; //违反条件,该物品不成立
for(k=1;k<=right[j][0];k++){
//在右边的话
if(right[j][k]==i){
find_out=true;
//在右边,却是轻物体
if(pos==1){
flag=true;
break;
}
if(pos==-1){
pos=2;
break;
}
}
}
if(find_out==false){flag=true;break;}
if(flag) break;
}
}//end for K
if(flag==false){
res++;
res_num=i;
}
}//end vis=1
}//end for N
if(res>1){
printf("0\n");
}else{
printf("%d\n",res_num);
}
}
return 0;
}
POJ 1029
最新推荐文章于 2020-07-14 16:29:03 发布