HDU 5625 Clarke and chemistry

来源:互联网 发布:centos 6.5 硬盘分区 编辑:程序博客网 时间:2024/05/22 08:03

Clarke and chemistry


Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 58    Accepted Submission(s): 30



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,bN.
 

Input
The first line contains an integer T(1T10), the number of test cases.
For each test case, the first line contains three integers A,B,C(1A,B,C26), 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, 1c100)
 

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

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

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

#include<cstring>#include<iostream>using namespace std;int num1[30];int num2[30];int sum[30];bool check(int a,int b){    int i;    for(i=0;i<26;i++){        if(a*num1[i]+b*num2[i]!=sum[i]){            return false;        }    }    return true;}int main(){    int T,t,flag,a,b,c,i,j;    char x;    cin>>T;    while(T--){        flag=0;        memset(num1,0,sizeof(num1));        memset(num2,0,sizeof(num2));        memset(sum,0,sizeof(sum));        cin>>a>>b>>c;        while(a--){            cin>>x>>t;            num1[x-'A']=t;        }        while(b--){            cin>>x>>t;            num2[x-'A']=t;        }        while(c--){            cin>>x>>t;            sum[x-'A']=t;        }        for(i=1;i<=100;i++){            for(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{            cout<<"NO"<<endl;        }    }    return 0;}



0 0