Clarke and chemistry
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 442 Accepted Submission(s): 243
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∗ .
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 )
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.
Source
Recommend
问题描述克拉克是一名人格分裂患者。某一天克拉克转换成了一名初中生,去考化学(实在编不下去了QAQ)。 考完后克拉克发现他没有得到满分,摔!他看了一下卷子,发现一个极其傻逼的化合反应配平他配错了(心里千万只哔~在奔腾)。 他十分不爽,于是想写一个程序来完成这个问题,于是他把问题交给了你。 克拉克遇到的化合反应是这样的: 你有两种化合物,A和B,A由∣A∣种元素组成,B由∣B∣种元素组成。 已知生成物为C,且系数为1。求出A和B的系数a,b使得化合反应aA+bB=C, a,b∈N∗成立。输入描述第一行是数据组数T(1≤T≤10). 每组数据第一行是三个整数A,B,C(1≤A,B,C≤26),分别表示∣A∣,∣B∣,∣C∣。 接下来A+B+C行,每行形如X c,分别表示A,B,C中元素X的个数为c(X为26个大写字母其中之一,保证同一物质中不会出现重复的元素,1≤c≤100)输出描述对于每组数据,输出一行。 如果能配平,输出字典序最小的答案(a最小的情况下b最小)。否则输出NO。
解题思路:
AC代码:模拟啊~注意细节处理就行了
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int main() { int t; scanf("%d",&t); while(t--){ int A[30],B[30],C[30]; int a,b,c,n; char x1[5]; memset(A,0,sizeof(A)); memset(B,0,sizeof(B)); memset(C,0,sizeof(C)); scanf("%d%d%d",&a,&b,&c); for(int i=0;i<a;i++){ scanf("%s%d",x1,&n); A[x1[0]-'A']=n; } for(int i=0;i<b;i++){ scanf("%s%d",x1,&n); B[x1[0]-'A']=n; } for(int i=0;i<c;i++){ scanf("%s%d",x1,&n); C[x1[0]-'A']=n; } int flag=1; int ans1=-1,ans2=-1; for(int i=0;i<26;i++){ if(!C[i]&&(A[i]||B[i])){ flag=0;break; } if((!A[i]&&!B[i])&&C[i]){ flag=0;break; } } if(!flag){ printf("NO\n"); continue; } for(int i=0;i<26;i++){ if(C[i]){ for(int j=1;j<=100;j++){ for(int k=1;k<=100;k++){ if(j*A[i]+k*B[i]==C[i]){ flag=1; for(int q=0;q<26;q++){ if(C[q]){ if(j*A[q]+k*B[q]!=C[q]){ flag=0;break; } } } if(flag==1){ ans1=j;ans2=k; } } if(ans1!=-1&&ans2!=-1)break; } if(ans1!=-1&&ans2!=-1)break; } } if(ans1!=-1&&ans2!=-1)break; } if(ans1==-1&&ans2==-1){ printf("NO\n"); } else{ printf("%d %d\n",ans1,ans2); } } return 0; }