zoukankan      html  css  js  c++  java
  • 洛谷P3265 装备购买

    这个大毒瘤题....居然反向卡精度....

    别的题eps要开小,这个毒瘤要开大...

    我一开始是1e-12,挂的奇惨无比,50分......

    然后改成1e-7,就70分了...

    1e-5 90分 1e-4 AC

    做法就是用高斯消元的变式,消出一个上三角形,然后把代价加起来就行了。

    每次选择花费最小的主元来消。

    如果这个位置是0,就横着挪一格。

     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cmath>
     4 const int N = 505;
     5 const double eps = 1e-4;
     6 
     7 double a[N][N];
     8 int m, n;
     9 
    10 inline void out() {
    11     for(int i = 1; i <= n; i++) {
    12         for(int j = 1; j <= m; j++) {
    13             printf("%lf ", a[i][j]);
    14         }
    15         printf("%.0lf 
    ", a[i][0]);
    16     }
    17     puts("");
    18     return;
    19 }
    20 
    21 inline void Gauss() {
    22     int i, t = 1;
    23     for(i = 1; i <= n; t++, i++) {
    24         if(t > m) {
    25             break;
    26         }
    27         for(int j = i; j <= n; j++) {
    28             if(fabs(a[i][t]) < eps && fabs(a[j][t]) > eps) {
    29                 std::swap(a[i], a[j]);
    30             }
    31             else if(fabs(a[j][t]) > eps && a[j][0] < a[i][0]) {
    32                 std::swap(a[i], a[j]);
    33             }
    34         }
    35         //out();
    36         if(fabs(a[i][t]) < eps) {
    37             i--;
    38             continue;
    39         }
    40         for(int j = i + 1; j <= n; j++) {
    41             double k = a[j][t] / a[i][t];
    42             for(int p = t; p <= m; p++) {
    43                 a[j][p] -= k * a[i][p];
    44             }
    45         }
    46         //out();
    47     }
    48     i--;
    49     printf("%d ", i);
    50     double ans = 0;
    51     for(int j = 1; j <= i; j++) {
    52         ans += a[j][0];
    53     }
    54     printf("%.0lf", ans);
    55     return;
    56 }
    57 
    58 int main() {
    59     scanf("%d%d", &n, &m);
    60     for(int i = 1; i <= n; i++) {
    61         for(int j = 1; j <= m; j++) {
    62             scanf("%lf", &a[i][j]);
    63         }
    64     }
    65     for(int i = 1; i <= n; i++) {
    66         scanf("%lf", &a[i][0]);
    67     }
    68     //out();
    69     Gauss();
    70     return 0;
    71 }
    AC代码
  • 相关阅读:
    Node Express4.x 片段视图 partials
    SVG知识难点
    MongoDB的安装和配置成服务的三种方法和一些难点
    git的使用
    单击获取索引的两种方式
    IOTA初识
    开始写博客啦
    虚拟化技术
    可信计算概论
    负载均衡
  • 原文地址:https://www.cnblogs.com/huyufeifei/p/9588625.html
Copyright © 2011-2022 走看看