题解|装备购买题解

[JLOI2015]装备购买

https://ac.nowcoder.com/acm/contest/1025/C

真正意义上的线性基...在关于向量加法和标量乘法的线性空间中的线性基。题目的意思就是要构造一个价格最低的基底。对于同个线性空间它的基底的位数不会变,那么要费用最低,可以按费用排序然后依次加入线性基判定是否可行。
关于证明,设该线性空间中的向量为,线性基中的向量为,若存在满足,,而A_k是费用最低的一个向量,显然可以对于任意一个,使得,那么就相当于用代替成为线性基中的一个元素,线性基的位数不变,可表出的向量不变。而总费用更低。所以这么贪心是正确的。

#include <bits/stdc++.h>
using namespace std;

#define ll long long
const long double eps = 1e-6;
const int N = 510;

int vis[N];
int n, m, ans, tot;
struct Node {
    int c;
    long double p[N];
} a[N];
bool operator < (Node a, Node b) {
    return a.c < b.c;
}

int main() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= m; ++j) {
            double tmp;
            scanf("%lf", &tmp);
            a[i].p[j] = tmp;
        }
    }
    for(int i = 1; i <= n; ++i) scanf("%d", &a[i].c);
    sort(a + 1, a + n + 1);
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= m; ++j) {
            if(fabs(a[i].p[j]) > eps) {
                if(vis[j]) {
                    long double rate = a[i].p[j] / a[vis[j]].p[j];
                    for(int k = 1; k <= m; ++k) 
                        a[i].p[k] -= rate * a[vis[j]].p[k];
                } else {
                    ans += a[i].c; 
                    ++tot;
                    vis[j] = i;
                    break;
                }
            }
        }
    }
    printf("%d %d\n", tot, ans);
}
全部评论

相关推荐

10-25 22:20
门头沟学院 Java
代码飞升_不回私信人...:同学院本,个人亮点去了,打招呼里面的废话也去了,学院本就是路边一条,明天拉满然后该学还是学,小厂也行尽量先有一段实习。另外你的项目描述写的不好,具体列一下可被提问的点,然后量化一下指标或者收益吧
投了多少份简历才上岸
点赞 评论 收藏
分享
秋招投简历提醒助手:个人经验是,一般面二十场左右就会进入侃侃而谈阶段。我今年七月末的时候开始的第一次面试,都是很多不会,回复很慢。后面慢慢迭代,到九月中的时候基本上面啥说啥,很放松的状态
远程面试的尴尬瞬间
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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