AcWing 5721. 化学方程式配平
原题链接
中等
作者:
_zyb
,
2024-09-27 05:10:19
,
所有人可见
,
阅读 16
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <unordered_map>
using namespace std;
const int N = 45;
const double eps = 1e-8;
double a[N][N]; // 系数矩阵
int n, m;
char fromAtoa(char c)
{
if (c >= 'A' && c <= 'Z')
return c + 32;
return c;
}
int gauss() // 高斯消元
{
int c, r;
for (c = 0, r = 0; c < m; c++)
{
int t = r;
for (int i = r; i < n; i++) // 找绝对值最大的行
if (fabs(a[i][c]) > fabs(a[t][c]))
t = i;
if (fabs(a[t][c]) < eps)
continue;
for (int i = c; i < m; i++)
swap(a[t][i], a[r][i]); // 将绝对值最大的行换到最顶端
for (int i = m - 1; i >= c; i--)
a[r][i] /= a[r][c]; // 将当前行的首位变成1
for (int i = r + 1; i < n; i++) // 用当前行将下面所有的列消成0
if (fabs(a[i][c]) > eps)
for (int j = m - 1; j >= c; j--)
a[i][j] -= a[r][j] * a[i][c];
r++;
}
//cout << r <<endl;
if (r < m)
return 1;
return 0; // 有唯一解
}
int main()
{
int t;
cin >> t;
for (int i = 0; i < t; i++)
{
memset(a, 0, sizeof a);
cin >> m;
n = 0;
unordered_map<string, int> ha;
for (int q = 0; q < m; q++)
{
int p = 0;
string str;
cin >> str;
string s;
for (int i = 0; i < str.size(); i++)
{
char c = fromAtoa(str[i]);
if ((c >= 'a' && c <= 'z') && (i + 1 < str.size() && (fromAtoa(str[i + 1]) >= 'a' && fromAtoa(str[i + 1]) <= 'z')))
s += c;
else if (c >= 'a' && c <= 'z')
{
s += c;
if (!ha[s])
{
//cout << s << endl;
ha[s] = ++n;
// cout << n << endl;
}
}
else if(i + 1 < str.size() && (fromAtoa(str[i + 1]) >= '0' && fromAtoa(str[i + 1]) <= '9'))
{
p = p*10+c-'0';
}
else{
p = p*10+c-'0';
a[ha[s]-1][q] += p;
s = "";
p=0;
}
//cout << s <<' ';
}
}
//cout << n << ' ' << m << endl;
int ans = gauss();
if(ans) cout <<'Y'<<endl;
else cout <<'N'<<endl;
}
return 0;
}
请问,为什么 r < m 就是可以配平的