1029 False coin

描述
“金条”银行从可靠的消息来源获得信息,在他们的最后一组N个硬币中,恰好一枚硬币是假的并且重量与其他硬币不同(而所有其他硬币的重量相等)。在经济危机之后,他们只有一个简单的平衡点(如图中的一个)。使用这种平衡,人们能够确定左平底锅中物体的重量是否小于,大于或等于右平底锅中物体的重量。
为了检测假硬币,银行雇员按1到N的整数对所有硬币进行编号,从而为每个硬币分配唯一的整数标识符。之后,他们开始通过在左平底锅和右平底锅中放置相同数量的硬币来加权各种硬币组。仔细记录硬币的标识符和权重的结果。
您将编写一个程序,帮助银行员工使用这些权重的结果确定虚假硬币的标识符。
输入
输入文件的第一行包含两个整数N和K,用空格分隔,其中N是硬币数(2 <= N <= 1000),K是满足的权重数(1 <= K <= 100) )。以下2K行描述了所有权重。两个连续的行描述每个权重。它们中的第一个以数字Pi(1 <= Pi <= N / 2)开始,表示放置在左侧和右侧平底锅中的硬币数量,后面是放置在左侧平底锅中的硬币的Pi标识符和Pi标识符硬币放在右边的锅里。所有数字都用空格分隔。第二行包含以下字符之一:'<','>'或'='。它代表权重的结果:
'<'表示左锅中硬币的重量小于右锅中硬币的重量,
'>'表示左平底锅中硬币的重量大于右平底锅中硬币的重量,
'='表示左平底锅中硬币的重量等于右平底锅中硬币的重量。
输出
如果无法通过给定权重的结果找到,则将输出文件写入假硬币的标识符或0。

样例输入

5 3
2 1 2 3 4
<
1 1 4
=
1 2 5
=

样例输出

3
#include<iostream> 
#include<cstring>
#include<string>
using namespace std;

int n, k;
int pl[505],pr[505];
int a[1005],b[1005];

int main()
{
    while (cin >> n >> k)
    {
        int t;
        int num = 0;
        char c;
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        while (k--)
        {
            cin >> t;
            for (int i = 0; i < t; i++)
                cin >> pl[i];
            for (int i = 0; i < t; i++)
                cin >> pr[i];
            cin >> c;
            if (c == '=')
            {
                for (int i = 0; i < t; i++)
                {
                    a[pl[i]] = b[pl[i]] = -1;
                    a[pr[i]] = b[pr[i]] = -1;
                }
            }
            else if (c == '<')
            {
                num++;
                for (int i = 0; i < t; i++)
                {
                    if (a[pl[i]] != -1)   a[pl[i]]++;
                    if (a[pr[i]]!= -1)      b[pr[i]]++;
                }
            }
            else if (c == '>')
            {
                num++;
                for (int i = 0; i < t; i++)
                {
                    if (a[pl[i]] != -1)   b[pl[i]]++;
                    if (a[pr[i]] != -1)      a[pr[i]]++;
                }
            }
        }
        int ans, count=0;
        for (int i = 1; i <= n; i++)
        {
            if (a[i] == num || b[i]==num)
            {
                ans = i;
                count++;
            }
            if (count == 2)  break;
        }
        if (count!=1)  cout << "0" << endl;
        else cout << ans << endl;
    }
}

来源:https://www.cnblogs.com/zyb993963526/p/6515377.html

posted on 2019-09-14 02:40  姜姜糖  阅读(258)  评论(0编辑  收藏  举报