Clarke and chemistry

Clarke and chemistry

Problem Description
Clarke is a patient with multiple personality disorder. One day, Clarke turned into a junior student and took a chemistry exam.
But he did not get full score in this exam. He checked his test paper and found a naive mistake, he was wrong with a simple chemical equation balancer.
He was unhappy and wanted to make a program to solve problems like this.
This chemical equation balancer follow the rules:
Two valences A combined by |A| elements and B combined by |B| elements.
We get a new valence C by a combination reaction and the stoichiometric coefficient of C is 1. Please calculate the stoichiometric coefficient a of A and b of B that aA+bB=C, a,b∈N∗.


Input
The first line contains an integer T(1≤T≤10), the number of test cases.
For each test case, the first line contains three integers A,B,C(1≤A,B,C≤26), denotes |A|,|B|,|C| respectively.
Then A+B+C lines follow, each line looks like X c, denotes the number of element X of A,B,C respectively is c. (X is one of 26 capital letters, guarantee X of one valence only appear one time, 1≤c≤100)


Output
For each test case, if we can balance the equation, print a and b. If there are multiple answers, print the smallest one, a is smallest then b is smallest. Otherwise print NO.


Sample Input
2
2 3 5
A 2
B 2
C 3
D 3
E 3
A 4
B 4
C 9
D 9
E 9
2 2 2
A 4
B 4
A 3
B 3
A 9
B 9


Sample Output
2 3
NO

Hint:
The first test case, $a=2, b=3$ can make equation right.
The second test case, no any answer.

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using  namespace std;
const int maxn=26;
int num1[maxn];
int num2[maxn];
int sum[maxn];
bool check(int a,int b)
{
    for(int i=0;i<26;i++)
    {
        if(a*num1[i]+b*num2[i]!=sum[i])
            return false;
    }
    return true;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        char ch;
        int d;
        int n,m,k,flag=0;
        memset(num1,0,sizeof(num1));
        memset(num2,0,sizeof(num2));
        memset(sum,0,sizeof(sum));
        scanf("%d %d %d",&n,&m,&k);
        for(int i=0;i<n;i++)
        {
            cin>>ch>>d;
            num1[ch-'A']=d;
        }
        for(int i=0;i<m;i++)
        {
            cin>>ch>>d;
            num2[ch-'A']=d;
        }
        for(int i=0;i<k;i++)
        {
            cin>>ch>>d;
            sum[ch-'A']=d;
        }
        int a=0,b=0;
        for(int i=1;i<=100;i++)
        {
            for(int j=1;j<=100;j++)
            {
                if(check(i,j))
                {
                    flag=1;
                    a=i;
                    b=j;
                    break;
                }
            }
            if(flag)
                break;
        }
        if(flag)
            cout<<a<<" "<<b<<endl;
        else
            printf("NO\n");
    }
    return 0;
}


你可能感兴趣的:(Clarke and chemistry)