HDU 3359 高斯消元模板题,
2017-03-22 18:25
435 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3359
题目的意思是,由矩阵A生成矩阵B的方法是:
以a[i][j]为中心的,哈曼顿距离不大于dis的数字的总和 / 个数,就是矩阵B的b[i][j]
现在给出B,要求A
那么我们设A矩阵为a[1][1], a[1][2], a[1][3].....
那么对于每一个b[i][j]我们有b[i][j] = (a[1][1] + a[1][2] + ... + ) / cnt
所以这样可以建议一条方程,然后guass求解。
注意题目的输出格式,printf("%8.2lf")后,不需要加空格。
高斯消元模板 && 题目
题目的意思是,由矩阵A生成矩阵B的方法是:
以a[i][j]为中心的,哈曼顿距离不大于dis的数字的总和 / 个数,就是矩阵B的b[i][j]
现在给出B,要求A
那么我们设A矩阵为a[1][1], a[1][2], a[1][3].....
那么对于每一个b[i][j]我们有b[i][j] = (a[1][1] + a[1][2] + ... + ) / cnt
所以这样可以建议一条方程,然后guass求解。
注意题目的输出格式,printf("%8.2lf")后,不需要加空格。
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <assert.h> #define IOS ios::sync_with_stdio(false) using namespace std; #define inf (0x3f3f3f3f) typedef long long int LL; #include <iostream> #include <sstream> #include <vector> #include <set> #include <map> #include <queue> #include <string> #include <bitset> const int maxn = 1e2 + 20; const double eps = 1e-7; class GaussMatrix { public: double a[maxn][maxn], x[maxn]; int equ, val; //方程个数(行),和变量个数(列),其中第val个是b值,不能取 void swapRow(int rowOne, int rowTwo) { for (int i = 1; i <= val; ++i) { swap(a[rowOne][i], a[rowTwo][i]); } } void swapCol(int colOne, int colTwo) { for (int i = 1; i <= equ; ++i) { swap(a[i][colOne], a[i][colTwo]); } } bool same(double x, double y) { return fabs(x - y) < eps; } int guass() { int k, col; for (k = 1, col = 1; k <= equ && col < val; ++k, ++col) { //不能取到第val个 int maxRow = k; //选出列最大值,误差最小 for (int i = k + 1; i <= equ; ++i) { if (fabs(a[i][col]) > fabs(a[maxRow][col])) { maxRow = i; } } if (same(a[maxRow][col], 0)) { --k; continue; } if (maxRow != k) swapRow(k, maxRow); for (int i = col + 1; i <= val; ++i) { //约去系数 a[k][i] /= a[k][col]; } a[k][col] = 1.0; //第一个就要变成1了,然后下面和上面的变成0 for (int i = 1; i <= equ; ++i) { if (i == k) continue; //当前这行,不操作 for (int j = col + 1; j <= val; ++j) { a[i][j] -= a[i][col] * a[k][j]; } a[i][col] = 0.0; } debug(); } for (k; k <= equ; ++k) { if (!same(a[k][val], 0)) return -1; //方程无解 } return val - k; //自由变量个数 } void debug() { for (int i = 1; i <= equ; ++i) { for (int j = 1; j <= val; ++j) { printf("%6.2lf ", a[i][j]); } printf("\n"); } printf("*******************************************\n\n"); } }arr; void work() { // arr.equ = 3, arr.val = 5; // arr.a[1][1] = 1, arr.a[1][2] = 2, arr.a[1][3] = -1, arr.a[1][4] = 1, arr.a[1][5] = 2; // arr.a[2][1] = 2, arr.a[2][2] = -1, arr.a[2][3] = 1, arr.a[2][4] = -3, arr.a[2][5] = -1; // arr.a[3][1] = 4, arr.a[3][2] = 3, arr.a[3][3] = -1, arr.a[3][4] = -1, arr.a[3][5] = 3; // int res = arr.guass(); // cout << res << endl; // arr.equ = 4, arr.val = 3 + 1; // arr.a[1][1] = 2, arr.a[1][2] = 3, arr.a[1][3] = 1, arr.a[1][4] = 4; // arr.a[2][1] = 1, arr.a[2][2] = -2, arr.a[2][3] = 4, arr.a[2][4] = -5; // arr.a[3][1] = 3, arr.a[3][2] = 8, arr.a[3][3] = -2, arr.a[3][4] = 13; // arr.a[4][1] = 4, arr.a[4][2] = -1, arr.a[4][3] = 9, arr.a[4][4] = -6; // cout << arr.guass() << endl; // arr.equ = 3, arr.val = 3 + 1; // arr.a[1][1] = 2, arr.a[1][2] = 3, arr.a[1][3] = 1, arr.a[1][4] = 16; // arr.a[2][1] = 1, arr.a[2][2] = 5, arr.a[2][3] = 2, arr.a[2][4] = 23; // arr.a[3][1] = 3, arr.a[3][2] = 4, arr.a[3][3] = 5, arr.a[3][4] = 33; // cout << arr.guass() << endl; // arr.equ = 3, arr.val = 4; // arr.a[1][1] = 2, arr.a[1][2] = 3, arr.a[1][3] = -1, arr.a[1][4] = 2; // arr.a[2][1] = 3, arr.a[2][2] = -2, arr.a[2][3] = 1, arr.a[2][4] = 2; // arr.a[3][1] = 1, arr.a[3][2] = -5, arr.a[3][3] = 2, arr.a[3][4] = 1; // cout << arr.guass() << endl; arr.equ = 3, arr.val = 4; arr.a[1][1] = 1, arr.a[1][2] = 2, arr.a[1][3] = 3, arr.a[1][4] = 4; arr.a[2][1] = 1, arr.a[2][2] = 0, arr.a[2][3] = 2, arr.a[2][4] = 5; arr.a[3][1] = 0, arr.a[3][2] = 0, arr.a[3][3] = 5, arr.a[3][4] = 5; cout << arr.guass() << endl; } int main() { #ifdef local freopen("data.txt", "r", stdin); // freopen("data.txt", "w", stdout); #endif work(); return 0; }
高斯消元模板 && 题目
相关文章推荐
- [高斯消元必有解的浮点模板] hdu 3359 Kind of a Blur
- hdu 3359 /poj 3999 Kind of a Blur(高斯消元模板题)
- hdu 3359 Kind of a Blur (高斯消元 浮点型)
- 【高斯消元】[HDU 3359][POJ3999][UVALive4741]Kind of a Blur
- HDU 3359 Kind of a Blur(高斯消元)
- hdu 3364 Lanterns 高斯消元,模板题
- 【HDU】3359 - Kind of a Blur(高斯消元 & 矩阵)
- HDU 3359 (浮点数高斯消元)
- hdu 3976 高斯消元 模板
- hdu 3364 Lanterns 高斯消元,模板题
- HDU 3359高斯消元
- hdu 3359(高斯消元)
- hdu 3359 Kind of a Blur(高斯消元求浮点型解)
- hdu 3976 Electric resistance 高斯消元(浮点满秩模板)
- HDU 4827 Cycle Cocycle 01高斯消元 bitset加速 模板
- hdu 5755(高斯消元——模线性方程组模板)
- HDU - 3359 Kind of a Blur - 高斯-约当消元
- hdu 3364 Lanterns(高斯消元模板题+亦或方程)
- hdu 3359 Kind of a Blur(高斯消元)
- hdu 3359 Kind of a Blur 高斯消元