装备购买(实数线性基)

装备购买

哈哈,这才是真正的线性基呀!跟线性代数里面学的一模一样!

题意

求给定矩阵的秩,并且所选的基底尽可能小(“小”的定义在题面中)

思路

  1. 像平时做的二进制线性基一样插入即可
  2. 插入前按照 c c c的值先排个序,就当做贪心了吧
  3. (补充:如果所有条件全部换成整数,而不是实数,则不能当做线性基处理。比如将此处的 m m m维换成 1 1 1维,那么这个问题就变成背包问题了,比如货币系统

题面描述

#include "bits/stdc++.h"
#define hhh printf("hhh\n")
#define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
using namespace std;
typedef long long ll;
typedef pair<int,int> pr;
inline int read() {int x=0;char c=getchar();while(c<'0'||c>'9')c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x;}

const int maxn = 5e2+10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
const double eps = 1e-6; //这里改成1e-10反而WA了两个点!!!

struct P{
    long double mat[maxn];
    int c;
    long double & operator [] (const int x) { return mat[x]; }
    friend bool operator < (const P &a, const P &b) { return a.c<b.c; }
}a[maxn];

int n, m, cnt, ans, p[maxn];

int main() {
    //ios::sync_with_stdio(false); cin.tie(0);
    n=read(), m=read();
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=m; ++j) scanf("%Lf", &a[i][j]);
    for(int i=1; i<=n; ++i) a[i].c=read();
    sort(a+1,a+1+n);
    for(int i=1; i<=n; ++i) {
        for(int j=1; j<=m; ++j) if(fabs(a[i][j])>eps) {
            if(!p[j]) { cnt++, ans+=a[i].c, p[j]=i; break; }
            long double t=a[i][j]/a[p[j]][j];
            for(int k=j; k<=m; ++k) a[i][k]-=t*a[p[j]][k];
        }
    }
    printf("%d %d\n", cnt, ans);
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 15:39
希望奇迹发生的布莱克...:真的是 现在卷实习就是没苦硬吃
点赞 评论 收藏
分享
Twilight_m...:经典我朋友XXXX起手,这是那种经典的不知道目前行情搁那儿胡编乱造瞎指导的中年人,不用理这种**
点赞 评论 收藏
分享
06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务