zoukankan      html  css  js  c++  java
  • hdu6465 高斯消元

    题目链接:水题

    高斯消元学习 高斯消元模板

    题解:来自官方

      1 #include<bits/stdc++.h>
      2 #include<iostream>
      3 #include<algorithm>
      4 #include<cstring>
      5 #include<cstdio>
      6 #include<vector>
      7 #include<stack>
      8 #include<queue>
      9 #include<cmath>
     10 #include<map>
     11 #include<set>
     12 #define ll long long
     13 #define ls l,m,rt<<1
     14 #define rs m+1,r,rt<<1|1
     15 #define ull unsigned long long
     16 #define pb push_back
     17 #define P pair<ll,ll>
     18 #define f first
     19 #define s second
     20 using namespace std;
     21 const int N = 101;
     22 const double EPS=1e-10;
     23 int m,n;
     24 int a[N][N];
     25 int free_x[N];
     26 double x[N];
     27 double ans[10];
     28 int gcd(int a,int b){
     29     if(!b) return a; else return gcd(b,a%b);
     30 }
     31 int lcm(int a,int b){
     32     return a/gcd(a,b)*b;
     33 }
     34 int Gauss(int equ,int var){
     35     int k,max_r,col = 0,ta,tb;
     36     int LCM,temp,num = 0,free_index;
     37     for(int i=0;i<=var;i++){
     38         x[i]=0;
     39         free_x[i]=true;
     40     }
     41     for(k = 0;k < equ && col < var;k++,col++){
     42         max_r=k;
     43         for(int i=k+1;i<equ;i++){
     44             if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;
     45         }
     46         if(max_r!=k){// 与第k行交换.
     47             for(int j=k;j<var+1;j++) swap(a[k][j],a[max_r][j]);
     48         }
     49         if(a[k][col]==0){// 说明该col列第k行以下全是0了,则处理当前行的下一列.
     50             free_x[num++] = col;
     51             k--;
     52             continue;
     53         }
     54         for(int i=k+1;i<equ;i++){// 枚举要删去的行.
     55             if(a[i][col]!=0){
     56                 LCM = lcm(abs(a[i][col]),abs(a[k][col]));
     57                 ta = LCM/abs(a[i][col]);
     58                 tb = LCM/abs(a[k][col]);
     59                 if(a[i][col]*a[k][col]<0)tb=-tb;//异号的情况是相加
     60                 for(int j=col;j<var+1;j++){
     61                     a[i][j] = a[i][j]*ta-a[k][j]*tb;
     62                 }
     63             }
     64         }
     65     }
     66     //无解
     67     for (int i = k; i < equ; i++){
     68         if (a[i][col] != 0) return -1;
     69     }
     70     //无穷解
     71     if (k < var){
     72         return var - k; // 自由变元有var - k个.
     73     }
     74     //唯一解
     75     for (int i = var - 1; i >= 0; i--){
     76         double temp = a[i][var];
     77         for (int j = i + 1; j < var; j++){
     78             if (a[i][j] != 0) temp -= a[i][j] * x[j];
     79         }
     80         //if (temp % a[i][i] != 0) return -2; // 说明有浮点数解,但无整数解.
     81         x[i] = 1.0*temp / a[i][i];
     82     }
     83     return 0;
     84 }
     85 struct point
     86 {
     87     int x,y;
     88 }st[10];
     89 int main()
     90 {
     91     int T;
     92     scanf("%d",&T);
     93     while(T--)
     94     {
     95         for(int i=1;i<=6;i++)
     96         {
     97             scanf("%d %d",&st[i].x,&st[i].y);
     98         }
     99         a[0][0]=st[1].x;a[0][1]=st[1].y;a[0][2]=1;a[0][3]=st[4].x;
    100         a[1][0]=st[2].x;a[1][1]=st[2].y;a[1][2]=1;a[1][3]=st[5].x;
    101         a[2][0]=st[3].x;a[2][1]=st[3].y;a[2][2]=1;a[2][3]=st[6].x;
    102         int tmp=Gauss(3,3);
    103         ans[0]=x[0];ans[1]=x[1];ans[2]=x[2];
    104         a[0][0]=st[1].x;a[0][1]=st[1].y;a[0][2]=1;a[0][3]=st[4].y;
    105         a[1][0]=st[2].x;a[1][1]=st[2].y;a[1][2]=1;a[1][3]=st[5].y;
    106         a[2][0]=st[3].x;a[2][1]=st[3].y;a[2][2]=1;a[2][3]=st[6].y;
    107         tmp=Gauss(3,3);
    108         ans[3]=x[0];ans[4]=x[1];ans[5]=x[2];
    109         int q;
    110         scanf("%d",&q);
    111         while(q--)
    112         {
    113             int x,y;
    114             scanf("%d %d",&x,&y);
    115             double tx=ans[0]*x+ans[1]*y+ans[2];
    116             double ty=ans[3]*x+ans[4]*y+ans[5];
    117             printf("%.2f %.2f
    ",tx,ty);
    118         }
    119     }
    120 
    121     return 0;
    122 }
    View Code
  • 相关阅读:
    【源码解析】Flink 是如何处理迟到数据
    Flink assignAscendingTimestamps 生成水印的三个重载方法
    【翻译】生成 Timestamps / Watermarks
    【翻译】The Broadcast State Pattern(广播状态)
    基于Broadcast 状态的Flink Etl Demo
    git 更新fork的远程仓库
    Flink 在IDEA执行时的webui
    配置ssh免密,仍需要密码
    第二章 Kubernetes进阶之使用二进制包部署集群
    Kubernetes之Ingress
  • 原文地址:https://www.cnblogs.com/lhclqslove/p/10572827.html
Copyright © 2011-2022 走看看