Clarke and chemistry
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 63 Accepted Submission(s): 33
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 AA
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 \in \text{N}^*
.
Input
The first line contains an integer T(1 \le T \le 10)
, the number of test cases.
For each test case, the first line contains three integers A, B, C(1 \le A, B, C \le 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 \le c \le 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
http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=671&pid=1001 中文题意
枚举 a,b 代码长时间不写 手糙了
今天02网上找模板水过 明天补看
#include<iostream> #include<cstring> #include<cstdio> #include<map> #include<stack> #include<queue> #define LL __int64 using namespace std; int t; int a,b,c; char ceshi[30]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char aa[30],bb[30],cc[30]; int aaa[30],bbb[30],ccc[30]; map<char,int> mp1; map<char,int> mp2; map<char,int> mp3; int main() { while(scanf("%d",&t)!=EOF) { for(int i=1;i<=t;i++) { mp1.clear(); mp2.clear(); mp3.clear(); scanf("%d%d%d",&a,&b,&c); getchar(); for(int j=1;j<=a;j++) { scanf("%c %d",&aa[j],&aaa[j]); mp1[aa[j]]=aaa[j];getchar(); } for(int j=1;j<=b;j++) { scanf("%c %d",&bb[j],&bbb[j]); mp2[bb[j]]=bbb[j];getchar(); } for(int j=1;j<=c;j++) { scanf("%c %d",&cc[j],&ccc[j]); mp3[cc[j]]=ccc[j];getchar(); } int k=0,g=0,ans; int flag=0; int ggg1,ggg2; for(k=1;k<=99;k++) { for(g=1;g<=99;g++) { ans=0; for(int kk=0;kk<=25;kk++) { if(mp1[ceshi[kk]]*k+mp2[ceshi[kk]]*g==mp3[ceshi[kk]]&&mp3[ceshi[kk]]!=0) ans++; } if(ans==c) { ggg1=k; ggg2=g; flag=1; break; } } if(flag) break; } if(flag) printf("%d %d\n",ggg1,ggg2); else printf("NO\n"); } } return 0; }