演算法學習之路|稱量硬幣(模擬)

kissjz發表於2018-02-27

有一堆硬幣,其中有一枚是假的,可能更輕也可能更重,用天平在兩邊放上相同數量的硬幣,找出假幣。

輸入格式:第一行兩個數N,K,表示硬幣數和稱量次數。接下來2K行,第一行第一個數表示天平兩邊硬幣個數n,後2n個數為兩邊硬幣編號,第二行為>,<或=符號

輸出格式:如果不能判斷哪個硬幣是假的,輸出0,能就輸出硬幣編號。

輸入樣例:
5 3
2 1 2 3 4
<
1 1 4
=
1 2 5
=

輸出樣例:
3

解題思路:用equal陣列標記沒問題的硬幣(兩邊重量相同則硬幣一定都是合格的)
用l和h陣列分別標記稱量出較輕和較重的硬幣,l和h標記相等的說明硬幣出現在輕的一側和重的一側的次數相等,硬幣是合格的,否則是不合格的。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,k,equ[1050],l[1050],h[1050],flag[1050],tmp[1050];
int main()
{
    scanf("%d%d",&n,&k);
    memset(equ,0,sizeof(equ));
    memset(l,0,sizeof(l));
    memset(h,0,sizeof(h));
    memset(tmp,0,sizeof(tmp));
    for (int i=1;i<=k;i++)
    {
        int x;
        char ch;
        scanf("%d",&x);
        for(int j=0;j<2*x;j++)
            scanf("%d",&tmp[j]);
        ch=getchar();
        while(ch!=`=` && ch!=`<` && ch!=`>`)
        {
            ch=getchar();
        }
        if(ch==`<`)
        {
            for(int j=0;j<x;j++)
                l[tmp[j]]=1;
            for(int j=x;j<2*x;j++)
                h[tmp[j]]=1;
            for(int j=1;j<=n;j++)
            {
                bool flag=true;
                for(int k=0;k<2*x;k++)
                    if(j==tmp[k])
                    {
                        flag=false;
                        break;
                    }
                if(flag)
                    equ[j]=1;
            }
        }
        else if(ch==`=`)
        {
            for(int j=0;j<2*x;j++)
                equ[tmp[j]]=1;
        }
        else if(ch==`>`)
        {
            for(int j=0;j<x;j++)
                h[tmp[j]]=1;
            for(int j=x;j<2*x;j++)
                l[tmp[j]]=1;
            for(int j=1;j<=n;j++)
            {
                bool flag=true;
                for(int k=0;k<2*x;k++)
                    if(j==tmp[k])
                    {
                        flag=false;
                        break;
                    }
                if(flag)
                    equ[j]=1;
            }
        }
    }
    int ans,cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(equ[i])
            continue;
        if(l[i]&&h[i])
            continue;
        ans=i;
        cnt++;
    }
    if(cnt>1)
        printf("0
");
    else
        printf("%d
", ans);
    return 0;
}


相關文章