Clarke and chemistry
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 173 Accepted Submission(s): 95
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 valencesA
combined by |A|
elements and B
combined by |B|
elements.
We get a new valenceC
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∗ .
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
We get a new valence
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 integersA,B,C(1≤A,B,C≤26) ,
denotes |A|,|B|,|C|
respectively.
ThenA+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 )
For each test case, the first line contains three integers
Then
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.
Source
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int A[27],B[27],C[27]; int main() { int t; scanf("%d",&t); while(t--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); char op[2]; bool flag=true; int d,maxx=0; memset(B,0,sizeof(B)); memset(C,0,sizeof(C)); memset(A,0,sizeof(A)); for(int i=0;i<a;i++) { scanf("%s%d",op,&d); A[op[0]-'A']=d; } for(int i=0;i<b;i++) { scanf("%s%d",op,&d); B[op[0]-'A']=d; } for(int i=0;i<c;i++) { scanf("%s%d",op,&d); C[op[0]-'A']=d; // maxx=max(maxx,d/A[op[0]-'A']); // maxx=max(maxx,d/B[op[0]-'A']); } int i,j,k; int min,x,y; for(i=1;i<=1000&&flag;i++) for(j=1;j<=1000;j++) { int s; for(s=0;s<26;s++) { x=i*A[s]+j*B[s]; y=C[s]; if(x==y) continue; else break; } if(s==26) flag=false; if(!flag) break; } if(!flag) printf("%d %d ",i-1,j); else printf("NO "); } return 0; }