hdoj5625Clarke and chemistry

来源:互联网 发布:苹果mac怎么更新系统 编辑:程序博客网 时间:2024/05/05 19:17

Clarke and chemistry

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 149    Accepted Submission(s): 79


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 Bthat 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
22 3 5A 2B 2C 3D 3E 3A 4B 4C 9D 9E 92 2 2A 4B 4A 3B 3A 9B 9
 

Sample Output
2 3NOHint:The first test case, $a=2, b=3$ can make equation right. The second test case, no any answer.
 

Source
BestCoder Round #72 (div.2)
 

#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<list>#include<vector>using namespace std;char stra[30],strb[30],strc[30];int  visa[30],visb[30],visc[30];int main(){    int a,b,c,i,j,t;    scanf("%d",&t);    while(t--){        scanf("%d%d%d",&a,&b,&c);        int aa=0,bb=0,cc=0,x;        bool flag=true;        memset(visa,0,sizeof(visa));        memset(visb,0,sizeof(visb));        memset(visc,0,sizeof(visc));        for(i=0;i<a;++i){            scanf("%s%d",stra,&x);            visa[stra[0]-'A']+=x;            aa+=x;        }        for(i=0;i<b;++i){            scanf("%s%d",strb,&x);            visb[strb[0]-'A']+=x;            bb+=x;        }        for(i=0;i<c;++i){            scanf("%s%d",strc,&x);            if(!visa[strc[0]-'A']&&!visb[strc[0]-'A'])flag=false;            visc[strc[0]-'A']+=x;            cc+=x;        }        if(flag){            int x,y;            bool sign=false;            for(x=1;x*aa<=cc;++x){                for(y=1;x*aa+y*bb<=cc;++y){                    if(x*aa+y*bb==cc){                        //printf("%d %d\n",x,y);                        for(i=0;i<=26;++i){                            if((x*visa[i]+y*visb[i])!=visc[i])break;                        }                        //printf("%d \n",visa[i]);                        if(i>26){                            sign=true;                            break;                        }                    }                }                if(sign)break;            }            if(sign){                printf("%d %d\n",x,y);            }            else {                printf("NO\n");            }        }        else {            printf("NO\n");        }    }    return 0;}


0 0
原创粉丝点击