AcWing 5721. 化学方程式配平
原题链接
中等
作者:
送葬的芙莉叶
,
2024-11-24 12:03:08
,
所有人可见
,
阅读 7
#include<bits/stdc++.h>
using namespace std;
#define small 0.0000000001
double gaosi[50][50]= {0};
void GAOSS(int start0,int start1,int num2,int m) {//矩阵的行和列
if(num2==start0||m==start1) {
return;
}
int bools=0;
for(int k=start0; k<num2; k++) {
if(abs(gaosi[k][start1])>small)
bools=1;
}
if(bools==0) {
GAOSS(start0,start1+1,num2,m);
} else {
if(abs(gaosi[start0][start1])<small) {
for(int i=1+start0; i<num2; i++) {
if(abs(gaosi[i][start1])>small) {
for(int j=start1; j<m; j++) {
double a=gaosi[start0][j];
gaosi[start0][j]=gaosi[i][j];
gaosi[i][j]=a;
}
break;
}//?
}
}
for(int i=1+start0; i<num2; i++) {
double temp=gaosi[i][start1];
for(int j=start1; j<m; j++) {
gaosi[i][j]-=gaosi[start0][j]*temp/gaosi[start0][start1];
}
}
GAOSS(start0+1,start1+1,num2,m);
}
}
bool IsLetter(char c) {
if(c>='a'&&c<='z') {
return true;
} else
return false;
}
bool IsDigist(char c) {
if(c>='0'&&c<='9') {
return true;
} else
return false;
}
int main() {
int n;
cin>>n;
for(int i=0; i<n; i++) {
int m;
cin>>m;
string str[m];
for(int j=0; j<m; j++) {
cin>>str[j];
}
map<string,int>mymap[m];
string string0[m][40];
int zongyuansu=0;
int num1=0;//num1是第几个元素,num2是第几个个数
for(int j=0; j<m; j++) {
int k=0;
num1=0;
bool bool0=true;
string chem;
string num;
int zimu=0,shuzi=0;
while(k<str[j].size()) {
if(bool0!=IsLetter(str[j][k])) {
if(bool0==true) {
zimu=1;//说明是字母
} else {
shuzi=1;//说明是数字
}
if(zimu+shuzi==2) {
mymap[j][chem]=stoi(num);
string0[j][num1]=chem;
num1++;
chem.erase();
num.erase();
zimu=0;
shuzi=0;
}
}
if(k==str[j].size()-1) {
num+=str[j][k];
mymap[j][chem]=stoi(num);
string0[j][num1]=chem;
chem.erase();
num.erase();
zimu=0;
shuzi=0;
}
bool0=IsLetter(str[j][k]);
if(bool0)
chem+=str[j][k];
else
num+=str[j][k];
k++;
}
}
/*for(int q=0; q<m; q++) {
string aa="c";
string bb="o";
cout<<mymap[q][aa]<<" "<<mymap[q][bb]<<endl;
}
for(int j=0; j<m; j++) {
int q=0;
while(string0[j][q]!="") {
cout<<string0[j][q]<<endl;
q++;
}
}*/
for(int q=0; q<40; q++) {
for(int qq=0; qq<m; qq++) {
gaosi[q][qq]=0;
}
}
int num2=0;//第num2种元素
map <string,int>M;
for(int j=0; j<m; j++) {
int q=0;
while(string0[j][q]!="") {
if(M[string0[j][q]]==0) {
for(int k=j; k<m; k++) {//对每一个mymap进行检查
if(mymap[k][string0[j][q]]!=0) {//如果mymap中显示被存储
gaosi[num2][k]=mymap[k][string0[j][q]];
}
}
M[string0[j][q]]=1;
num2++;
}
q++;
}
}
GAOSS(0,0,num2,m);
// for(int k=0; k<num2; k++) {
// int bools=0;
// for(int kk=0; kk<m; kk++) {
// cout<<gaosi[k][kk]<<" ";
//
// }
// cout<<endl;
// }
int sum=0;
for(int k=0; k<num2; k++) {
int bools=0;
for(int kk=0; kk<m; kk++) {
// cout<<gaosi[k][kk]<<" ";
if(abs(gaosi[k][kk])>small) {
sum++;
break;
}
}
// cout<<endl;
}
// cout<<sum<<endl;
if(sum<m) {
cout<<"Y"<<endl;
} else {
cout<<"N"<<endl;
}
}
return 0;
}