您的位置:首页 > 其它

bestcoder 72 Clarke and chemistry

2016-02-14 16:02 218 查看


Clarke and chemistry

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

Total Submission(s): 195 Accepted Submission(s): 110



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 thataA+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 Xof
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<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<map>

using namespace std;

typedef long long ll;
const ll inf = 0x3f3f3f3f;
int a[30], b[30], c[30];
char ch[2];
int an, bn, cn;

void solve(){
scanf("%d%d%d", &an, &bn, &cn);
for (int i = 0; i <= 27; i++){
a[i] = b[i] = c[i] = 0;
}
int ind;
for (int i = 0; i < an; i++){
scanf("%s", ch);
scanf("%d", &ind);
a[ch[0] - 'A'] += ind;
}
for (int i = 0; i < bn; i++){
scanf("%s", ch);
scanf("%d", &ind);
b[ch[0] - 'A'] += ind;
}
for (int i = 0; i < cn; i++){
scanf("%s", ch);
scanf("%d", &ind);
c[ch[0] - 'A'] += ind;
}

int resa = -1, resb = -1;
for (int i = 1; i < 101; i++){
for (int j = 1; j < 101; j++){
int flag = 1;
for (int k = 0; k < 26; k++){
if (a[k] * i + b[k] * j != c[k]){
flag = 0; break;
}
}
if (flag == 1){
resa = i, resb = j;
}
}
if (resa != -1)break;
}
if (resa == -1 || resb == -1){printf("NO\n");return ;}
printf("%d %d\n", resa, resb);
}

int main(){
int t;
scanf("%d", &t);
while (t--){
solve();
}
return 0;
}
</map></stack></queue></cmath></cstring></algorithm></cstdio>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: