首页 > 其他分享 >G68 实数线性基+高斯消元法 P3265 [JLOI2015] 装备购买

G68 实数线性基+高斯消元法 P3265 [JLOI2015] 装备购买

时间:2024-07-16 16:10:16浏览次数:6  
标签:JLOI2015 P3265 int double 线性 include 高斯消

视频链接:G68 实数线性基+高斯消元法 P3265 [JLOI2015] 装备购买_哔哩哔哩_bilibili

 

 

P3265 [JLOI2015] 装备购买 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

// 线性基+高斯消元法 O(n*m*m)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const double eps=1e-5;
const int N=510;
int n,m;
struct node{
  double z[N]; //属性
  int c;       //花费
  bool operator<(node& b){
    return c<b.c;
  }
}a[N];
int p[N],cnt,ans;

void gauss(){ //高斯消元法
  for(int i=1;i<=n;++i){
    for(int j=1;j<=m;++j){
      if(abs(a[i].z[j])>eps){ //如果(i,j)>0
        if(!p[j]){ //如果p[j]不存在
          p[j]=i;  //记录最高位为第j位的线性基
          ans+=a[i].c; //累计花费
          cnt++;       //累计个数
          break;
        }
        else{ //如果p[j]存在,则行消元
          double d=a[i].z[j]/a[p[j]].z[j];
          for(int k=j;k<=m;++k)
            a[i].z[k]-=a[p[j]].z[k]*d;
        }
      }
    }
  }
}
int main(){
  cin>>n>>m;
  for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j) cin>>a[i].z[j];
  for(int i=1;i<=n;++i) cin>>a[i].c;
  sort(a+1,a+1+n); //按花费升序
  gauss();
  cout<<cnt<<' '<<ans<<endl;
}

 

// 线性基+贪心法 O(n*m*m)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const double eps=1e-5;
const int N=510;
int n,m;
struct node{
  double z[N]; //属性
  int c;       //花费
  bool operator<(node& b){
    return c<b.c;
  }
}a[N];
int p[N],cnt,ans;

void insert(int i){ //贪心法
  for(int j=1;j<=m;++j){
    if(abs(a[i].z[j])>eps){ //如果(i,j)>0
      if(!p[j]){ //如果p[j]不存在
        p[j]=i;  //记录最高位为第j位的线性基
        ans+=a[i].c; //累计花费
        cnt++;       //累计个数
        break;
      }
      else{ //如果p[j]存在,则行消元
        double d=a[i].z[j]/a[p[j]].z[j];
        for(int k=j;k<=m;++k)
          a[i].z[k]-=a[p[j]].z[k]*d;
      }
    }
  }
}
int main(){
  cin>>n>>m;
  for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j) cin>>a[i].z[j];
  for(int i=1;i<=n;++i) cin>>a[i].c;
  sort(a+1,a+1+n); //按花费升序
  for(int i=1;i<=n;++i) insert(i);
  cout<<cnt<<' '<<ans<<endl;
}

 

标签:JLOI2015,P3265,int,double,线性,include,高斯消
From: https://www.cnblogs.com/dx123/p/18299684

相关文章

  • 高斯消元
    高斯-约旦消元解线性方程组例题:线性方程组步骤:选出未被更新的行中第\(k\)列绝对值最大的值,令为主元把主元所在行移到当前行,加减消元消去主元重复12结束后若存在找不到主元(找到是0)的情况,那就遍历没处理的行,如果有常数项非\(0\)则无解,否则无数解点击查看代......
  • 高斯消元
    前言:由于作者未系统过学习线性代数,故下文肯定有不严谨的成分,不过应付算法竞赛是绰绰有余了QAQ。\[\begin{cases}a_{1,1}x_1+a_{1,2}x_2+\cdots+a_{1,n}x_n=b_1\\a_{2,1}x_1+a_{2,2}x_2+\cdots+a_{2,n}x_n=b_2\\\cdots\\a_{n,1}x_1+a_{n,2......
  • 高斯消元和矩阵快速幂
    高斯消元高斯消元是一种能在\(O(N^3)\)的时间内求解\(N\)元一次方程组的算法。其思路大致如下:使第一个未知数只有第一个式子中系数非\(0\)。使第二个未知数只有第二个式子中系数非\(0\)。\(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\vdots\)使第......
  • AcWing算法基础课笔记——高斯消元
    高斯消元用来求解方程组a11x1+......
  • 高斯消元学习笔记
    引入高斯-约当消元法(Gauss–Jordanelimination)是求解线性方程组的经典算法,它在当代数学中有着重要的地位和价值,是线性代数课程教学的重要组成部分。高斯消元法除了用于线性方程组求解外,还可以用于行列式计算、求矩阵的逆,以及其他计算机和工程方面。过程一个经典的问题,给定一......
  • 高斯消元学习笔记
    高斯消元学习笔记其实这个主题能够复活主要还是粘了\(\text{LGV}\)引理的光,不然我还不知道高斯消元其实不光能求解线性方程组。求解线性方程组这个只能说是典中典了,我不相信没有一个人的高斯消元不是从这里开始的。我们考虑求解线性方程组的本质:将每一个式子所有未知数前都......
  • 高斯消元学习笔记——P304题解
    如果你觉得这篇太啰嗦问题[SDOI2006]线性方程组题目描述已知\(n\)元线性一次方程组。\[\begin{cases}a_{1,1}x_1+a_{1,2}x_2+\cdots+a_{1,n}x_n=b_1\\a_{2,1}x_1+a_{2,2}x_2+\cdots+a_{2,n}x_n=b_2\\\cdots\\a_{n,1}x_1+a_{n,2}x......
  • 高斯消元
    不会高斯消元/kk。高斯消元,就是通过某种操作消元得到答案。eg:\[\begin{cases}3x+5y+z=20\\x-2y+3z=19\\2x-6y+z=6\end{cases}\]把它变成增广矩阵形式:\[\begin{bmatrix}3&5&1&&20\\1&-2&3&&19\\2&-6&1&&6\end{bmatrix}\]怎么把\(x\)消掉......
  • [学习笔记] 高斯消元 - 线性代数
    高斯-约旦消元下面给两道板子【模板】高斯消元法最最基础的板子,没啥哆嗦的。下面给出高斯-约旦消元解法。#include<bits/stdc++.h>usingnamespacestd;intn,dt=1;doubleeps=1e-9,m[102][102];intmain(){ scanf("%d",&n); for(inti=1;i<=n;++i) for(intj......
  • 高斯消元
    epsilon=pow(10,-10)g=[]for_inrange(int(input())):g.append([*map(float,input().split())])n,m=len(g),len(g[0])row=0forcolinrange(n):max_row=row#找出剩下行最大列值所在的行foriinrange(row,n):ifabs(g[i][col]......