题解 P3265 【[JLOI2015]装备购买】

这题xswl,我把\(m\)打成\(n\)得了\(90\),一看数据……

Solution [JLOI2015]装备购买

题目大意:给定\(n\)个装备,每个装备属性是一个长为\(m\)的向量,有一个价格,你购买的装备属性必须是线性无关的,求最大可购买的装备数,以及此前提下的最小价格和

线性基,高斯消元



我们把所有装备的属性排成一个矩阵,那么我们可以购买的最大的装备数量就是这个矩阵的秩

然后这个东西就可以高斯消元来做了,普通的高斯消元对于每个主元\(x_i\),选取前\(i-1\)列为\(0\),第\(i\)列绝对值最大的行向量进行消元,这样可以提高数值稳定性,但是这里我们同时要求权值之和最小,我们就贪心的在符合条件的行向量中选权值最小的即可,因此可能略微炸精度

#include <iostream>
#include <algorithm>
using namespace std;
typedef long double type;
const int maxn = 512;
const type eps = 1e-6;
type mat[maxn][maxn];
inline type mabs(type x){return x > 0 ? x : -x;}
inline bool iszero(type x){return mabs(x) < eps;}
int n,m,ans1,ans2,cost[maxn];
inline void gauss(){
    for(int i = 1;i <= n;i++){
        int r = i;
        while(r <= n && iszero(mat[r][i]))r++;
        if(r == n + 1)return;
        for(int j = r + 1;j <= n;j++)
            if(!iszero(mat[j][i]) && cost[j] < cost[r])r = j;
        swap(mat[i],mat[r]),swap(cost[i],cost[r]);
        ans1 += 1,ans2 += cost[i];
        for(int j = i + 1;j <= n;j++){
            type f = mat[j][i] / mat[i][i];
            for(int k = i;k <= n;k++)
                mat[j][k] -= mat[i][k] * f;
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin >> n >> m;
    for(int i = 1;i <= n;i++)
        for(int j = 1;j <= m;j++)
            cin >> mat[i][j];
    for(int i = 1;i <= n;i++)
        cin >> cost[i];
    gauss();
    cout << ans1 << " " << ans2 << '\n';
    return 0;
}

原文地址:https://www.cnblogs.com/colazcy/p/11714040.html

时间: 2024-08-22 17:08:07

题解 P3265 【[JLOI2015]装备购买】的相关文章

【BZOJ4004】[JLOI2015]装备购买 贪心+高斯消元

[BZOJ4004][JLOI2015]装备购买 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j <= m),每个装备需要花费 ci,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着怎样才能花尽量少的钱买尽量多的装备.对于脸哥来说,如果一件装备的属性能用购买的其他装备组合出(也就是说脸哥可以利用手上的这些装备组合出这件装备的效果),那么这件

[JLOI2015]装备购买(线性基)

[JLOI2015]装备购买 题目描述 脸哥最近在玩一款神奇的游戏,这个游戏里有 nn 件装备,每件装备有 \(m\) 个属性,用向量 \(\mathbf{z_i}\)=\((a_1, \ldots ,a_j, \ldots , a_m)\) 表示 \(1 \leq i \leq n\), \(1 \leq j \leq m\),每个装备需要花费 \(c_i\) ,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着怎样才能花尽量少的钱买尽量多的装备.对于脸哥来说,如果一件装备的属性能用购买的其他

bzoj 4004: [JLOI2015]装备购买 拟阵 &amp;&amp; 高消

4004: [JLOI2015]装备购买 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 337  Solved: 139[Submit][Status][Discuss] Description 脸 哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j <= m),每个装备需要花费 ci,现在脸哥想买一些装备,但是脸哥很穷,

BZOJ 4004: [JLOI2015]装备购买

4004: [JLOI2015]装备购买 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1158  Solved: 377[Submit][Status][Discuss] Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j <= m),每个装备需要花费 ci,现在脸哥想买一些装备,但是脸哥很穷,

[JLOI2015]装备购买 (高斯消元)

[JLOI2015]装备购买 \(solution:\) 首先这道题的题面已经非常清晰的告诉我们这就是线性空间高斯消元的一道题(可以用某些装备来表示另一件装备,这已经不能再明显了),只是这道题要求我们求出花费最小的方案,这个我们可以直接贪心,如果有多个装备可以匹配某一个属性,那么我们选价值最小的那一个(这个可以用线性空间的定义证明),价值大的尽量往后再选(选到最后剩下一些价格大的不买即可) \(code:\) #include<iostream> #include<cstdio>

BZOJ4004:[JLOI2015]装备购买——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=4004 https://www.luogu.org/problemnew/show/P3265 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j <= m),每个装备需要花费 ci,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着怎样才能花尽量少的钱买尽量多的装备.

Bzoj4004 [JLOI2015]装备购买

Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1092  Solved: 359 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j <= m),每个装备需要花费 ci,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着 怎样才能花尽量少的钱买尽量多的装备.对于脸哥来说,如果一件装备的属性能用购买

【bzoj4004】[JLOI2015]装备购买 贪心+高斯消元求线性基

题目描述 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j <= m),每个装备需要花费 ci,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着怎样才能花尽量少的钱买尽量多的装备.对于脸哥来说,如果一件装备的属性能用购买的其他装备组合出(也就是说脸哥可以利用手上的这些装备组合出这件装备的效果),那么这件装备就没有买的必要了.严格的定义是,如果脸哥买了 zi1,...

[JLOI2015]装备购买

题解 高斯消元? 首先考虑如果是能否被异或出来应该怎么办? 按价值排序后从价格低的往价格高的插入线性基 能插入的就买下来 那么考虑线性基表示的是什么 线性基表示的是把一个数看做二进制数,每一位就是一维的空间 然后求能把所有向量包含在这个空间的最小向量集 考虑线性基在插入一个向量的时候做的是什么? 高斯消元! 把要插入的这一位消成0 如果消不成就把这个向量插入线性基 否则就继续往后找其他位 那么构建好的线性基本质上就是高斯消元消成的上三角矩阵 那么这个题就也是同理了 按照价值从小到大依次插入 然后