• hdu 3359 Kind of a Blur (高斯消元 浮点型)


    题目链接

    题意:

    H * W (W,H <= 10) 的矩阵A的某个元素A[i][j],从它出发到其他点的曼哈顿距离小于等于D的所有值的和S[i][j]除上可达点的数目,构成了矩阵B。给定矩阵B,求矩阵A。

    分析:

    将所有矩阵A的元素看成自变量,一共有H*W个变量,每个矩阵B的元素是由这些变量组合而成的,对于固定的B[i][j],曼哈顿距离在D以内的A[x][y]的系数为1,其它为0,这样就变成了求H*W个变量和H*W个方程的线性方程组,高斯消元求解。这题数据量比较小,所以直接采用浮点数的高斯消元即可,需要注意的是,浮点数消元的时候为了避免精度误差,每次找最大的行,乘上一个小于1的系数进行消元,这样可以把误差降到最小。

    本来很快就搞定的,但是脑残了,总是pE,后来又wa,一定要把b[][]变成浮点数,才行,不然会wa 有误差。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <cstdlib>
      5 #include <cmath>
      6 #include <algorithm>
      7 #define LL __int64
      8 #define eps 1e-8
      9 const int maxn = 100+10;
     10 using namespace std;
     11 int equ, var;
     12 double a[maxn][maxn], x[maxn];
     13 
     14 int Gauss()
     15 {
     16     int i, j, k, max_r, col;
     17     double tmp;
     18     col = 0;
     19 
     20     for(k = 0; k<equ && col<var; k++, col++)
     21     {
     22         max_r = k;
     23         for(i = k+1; i < equ; i++)
     24             if(fabs(a[i][col])-fabs(a[max_r][col]) > eps)
     25             max_r = i;
     26 
     27         if(max_r != k)
     28             for(j = k; j < var+1; j++)
     29             swap(a[k][j], a[max_r][j]);
     30 
     31         if(fabs(a[k][col]) < eps)
     32         {
     33             k--;
     34             continue;
     35         }
     36         for(i = k+1; i < equ; i++)
     37         {
     38             if(fabs(a[i][col]) > eps)
     39             {
     40                 double t = a[i][col]/a[k][col];
     41                 a[i][col] = 0.0;
     42 
     43                 for(j = col; j < var+1; j++)
     44                 a[i][j] -= a[k][j]*t;
     45             }
     46         }
     47     }
     48     for(i = var-1; i >= 0; i--)
     49     {
     50         if(fabs(a[i][i]) < eps) continue;
     51         tmp = a[i][var];
     52         for(j = i+1; j < var; j++)
     53         if(a[i][j] != 0)
     54         tmp -= a[i][j]*x[j];
     55 
     56         //if(tmp%a[i][i] != 0) return -2;
     57         x[i] = tmp/a[i][i];
     58     }
     59     return 0;
     60 }
     61 int mht(int x1, int y1, int x2, int y2)
     62 {
     63     return abs(x1-x2)+abs(y1-y2);
     64 }
     65 
     66 int main()
     67 {
     68     int n, m, d;
     69     int f = 0, i, j, k, l;
     70     double b[maxn][maxn];
     71     while(cin>>m>>n>>d)
     72     {
     73         if(m==0&&n==0&&d==0) break;
     74         if(f)
     75         cout<<endl;
     76         f = 1;
     77         equ = n*m;
     78         var = n*m;
     79         memset(a, 0, sizeof(a));
     80         memset(x, 0, sizeof(x));
     81         for(i = 0; i < n; i++)
     82         for(j = 0; j < m; j++)
     83         cin>>b[i][j];
     84         for(i = 0; i < n; i++)
     85         for(j = 0; j < m; j++)
     86         for(k = 0; k < n; k++)
     87         for(l = 0; l < m; l++)
     88         if(mht(i, j, k, l) <= d)
     89         {
     90             a[i*m+j][k*m+l] = 1;
     91             a[i*m+j][n*m] += b[i][j];
     92         }
     93         Gauss();
     94         for(i = 0; i < n; i++)
     95         {
     96             for(j = 0; j < m; j++)
     97             printf("%8.2lf", x[i*m+j]);
     98             cout<<endl;
     99         }
    100     }
    101     return 0;
    102 }
  • 相关阅读:
    HDU——T 3342 Legal or Not
    Web框架本质
    February 5 2017 Week 6 Sunday
    February 4 2017 Week 5 Saturday
    February 3 2017 Week 5 Friday
    February 2 2017 Week 5 Thursday
    February 1 2017 Week 5 Wednesday
    January 31 2017 Week 5 Tuesday
    January 30 2017 Week 5 Monday
    January 29 2017 Week 5 Sunday
  • 原文地址:https://www.cnblogs.com/bfshm/p/3933540.html
Copyright © 2020-2023  润新知