POJ 1029

//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;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值