首页 > 代码库 > poj1029(找假硬币)模拟

poj1029(找假硬币)模拟

题意:给n个硬币,其中有一个硬币和其他的硬币重量不一样,给出k次比较重量的结果。问是否可以将假硬币找出来。


解法:判断一个硬币是真币的方法(满足其一):

         1、这个硬币出现过在=的两边 

         2、既出现在小于的一边过,也出现在大于的一边过。

        如果排除这些硬币后只剩下一个,那么假币就是剩下的那个,否则就是不确定。

代码:

/****************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>

using namespace std;

#define eps 1e-8
typedef long long LL;




int n,k;
int num[1010];
int rem[1010];
vector<int> vec1;
vector<int> vec2;
int main()
{
    while(scanf("%d%d",&n,&k)==2)
    {
        memset(num,0,sizeof num);
        memset(rem,0,sizeof rem);
        int sum=0;
        int ans=0;
        for(int i=0; i<k; i++)
        {
            int m;
            vec1.clear();
            vec2.clear();
            scanf("%d",&m);
            for(int i=0; i<m; i++)
            {
                int a;
                scanf("%d",&a);
                vec1.push_back(a);
            }
            for(int i=0; i<m; i++)
            {
                int a;
                scanf("%d",&a);
                vec2.push_back(a);
            }
            char c;
            cin>>c;
            if(c==‘<‘)
            {
                sum++;
                for(int i=0; i<m; i++)
                {
                    num[vec1[i]]++;
                    num[vec2[i]]++;
                    if(rem[vec1[i]]==1)
                        rem[vec1[i]]=2;
                    else if(rem[vec1[i]]!=2)
                        rem[vec1[i]]=-1;

                    if(rem[vec2[i]]==-1)
                        rem[vec2[i]]=2;
                    else if(rem[vec2[i]]!=2)
                        rem[vec2[i]]=1;
                }
            }
            else  if(c==‘>‘)
            {
                sum++;
                for(int i=0; i<m; i++)
                {
                    num[vec1[i]]++;
                    num[vec2[i]]++;
                    if(rem[vec1[i]]==-1)
                        rem[vec1[i]]=2;
                    else if(rem[vec1[i]]!=2)
                        rem[vec1[i]]=1;

                    if(rem[vec2[i]]==1)
                        rem[vec2[i]]=2;
                    else if(rem[vec2[i]]!=2)
                        rem[vec2[i]]=-1;
                }
            }
            else
            {
                for(int i=0; i<m; i++)
                {
                    rem[vec1[i]]=2;
                    rem[vec2[i]]=2;
                }
            }
        }
        for(int i=1; i<=n; i++)
        {
            if(rem[i]!=2&&(((num[i]==sum)&&(sum!=0))||sum==0))
            {
                if(ans==0)
                    ans=i;
                else
                {
                    ans=0;
                    break;
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}