hdoj--5625--Clarke and chemistry(枚举)

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 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, 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\n",i-1,j);
		else printf("NO\n");
	}
	return 0;
}


posted @ 2016-02-14 13:38  上弦月307  阅读(138)  评论(0编辑  收藏  举报