4004: [JLOI2015]装备购买

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 337  Solved: 139
[Submit][Status][Discuss]

Description


哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i
<= n; 1 <= j <= m),每个装备需要花费
ci,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着怎样才能花尽量少的钱买尽量多的装备。对于脸哥来说,如果一件装备的属性能用购买的其他装备组
合出(也就是说脸哥可以利用手上的这些装备组合出这件装备的效果),那么这件装备就没有买的必要了。严格的定义是,如果脸哥买了
zi1,.....zip这 p 件装备,那么对于任意待决定的 zh,不存在 b1,....,bp 使得 b1zi1 + ... + bpzip =
zh(b 是实数),那么脸哥就会买 zh,否则 zh 对脸哥就是无用的了,自然不必购买。举个例子,z1 =(1; 2; 3);z2 =(3;
4; 5);zh =(2; 3; 4),b1 =1/2,b2 =1/2,就有 b1z1 + b2z2 = zh,那么如果脸哥买了 z1 和 z2
就不会再买 zh 了。脸哥想要在买下最多数量的装备的情况下花最少的钱,你能帮他算一下吗?

Input

第一行两个数 n;m。

接下来 n 行,每行 m 个数,其中第 i 行描述装备 i 的各项属性值。
接下来一行 n 个数,其中 ci 表示购买第 i 件装备的花费。

Output

一行两个数,第一个数表示能够购买的最多装备数量,第二个数表示在购买最多数量的装

备的情况下的最小花费。

Sample Input

3 3
1 2 3
3 4 5
2 3 4
1 1 2

Sample Output

2 2

HINT

如题目中描述,选择装备 1 装备 2,装备 1 装备 3,装备 2 装备 3 均可,但选择装备 1 和

装备 2 的花费最小,为 2。
对于 100% 的数据, 1 <= n;m <= 500; 0 <= aj <= 1000。

  @idy002 不用eps照样能A啦啦啦。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cassert>
using namespace std;
#define MAXN 510
#define MOD 1000000007
typedef long long qword;
struct item
{
int a[MAXN];
int v;
}lst[MAXN];
bool cmp_lst(const item& l1,const item& l2)
{
return l1.v<l2.v;
}
qword mat[MAXN][MAXN];
int totm=;
qword pow_mod(qword x,qword y)
{
qword ret=;
while (y)
{
if (y&)
ret=ret*x%MOD;
x=x*x%MOD;
y>>=;
}
return ret;
} int main()
{
freopen("input.txt","r",stdin);
int n,m,x,y,z;
scanf("%d%d",&n,&m);
for (int i=;i<n;i++)
for (int j=;j<m;j++)
scanf("%d",&lst[i].a[j]);
for (int i=;i<n;i++)
scanf("%d",&lst[i].v);
sort(lst,lst+n,cmp_lst);
int ans1=,ans2=;
for (int i=;i<n;i++)
{
for (int j=;j<m;j++)
mat[totm][j]=lst[i].a[j];
for (int j=;j<totm;j++)
{
x=;
for (int k=;k<m;k++)
{
x=k;
if (mat[j][k])break;
}
qword t=mat[totm][x]/mat[j][x];
for (int k=;k<m;k++)
mat[totm][k]=(mat[totm][k]-mat[j][k]*t)%MOD;
}
bool flag=false;
for (int j=;j<m;j++)
{
flag|=mat[totm][j];
if (flag)break;
}
if (!flag)
continue;
ans1++;
ans2+=lst[i].v;
x=;
for (int j=;j<m;j++)
{
x=j;
if (mat[totm][j])break;
}
qword t=pow_mod(mat[totm][x],MOD-);
for (int j=;j<m;j++)
mat[totm][j]=mat[totm][j]*t%MOD;
for (int j=totm;j>;j--)
{
bool flag;
for (int k=;k<m;k++)
{
if (mat[j-][k] || mat[j][k])
{
assert(!(mat[j-][k] && mat[j][k]));
if (mat[j-][k])
{
flag=false;
}else
{
flag=true;
}
break;
}
}
if (!flag)break;
for (int k=;k<m;k++)
swap(mat[j-][k],mat[j][k]);
}
totm++;
}
printf("%d %d\n",ans1,ans2);
}

bzoj 4004: [JLOI2015]装备购买 拟阵 && 高消的更多相关文章

  1. bzoj 4004 [JLOI2015]装备购买 拟阵+线性基

    [JLOI2015]装备购买 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1820  Solved: 547[Submit][Status][Dis ...

  2. bzoj 4004 [JLOI2015]装备购买——拟阵证明贪心+线性基

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4004 看Zinn博客水过去…… 运用拟阵可以证明按价格从小到大买的贪心是正确的.但自己还不会 ...

  3. BZOJ 4004: [JLOI2015]装备购买

    4004: [JLOI2015]装备购买 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1154  Solved: 376[Submit][Statu ...

  4. 【BZOJ 4004】 装备购买(高斯消元+贪心)

    装备购买 题目 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am) 表示 (1 <= i <= n; 1 <= j ...

  5. BZOJ 4004 JLOI2015 装备购买 高斯消元+线性基

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4004 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装 ...

  6. BZOJ 4004: [JLOI2015]装备购买 [高斯消元同余 线性基]

    和前两(一)题一样,不过不是异或方程组了..... 然后bzoj的新数据是用来卡精度的吧..... 所有只好在模意义下做啦 只是巨慢无比 #include <iostream> #incl ...

  7. BZOJ 4004: [JLOI2015]装备购买 高斯消元解线性基

    BZOJ严重卡精,要加 $long$  $double$ 才能过. 题意:求权和最小的极大线性无关组. 之前那个方法解的线性基都是基于二进制拆位的,这次不行,现在要求一个适用范围更广的方法. 考虑贪心 ...

  8. BZOJ 4004 [JLOI2015]装备购买 | 线性基

    题目链接 Luogu P3265 题解 非常正常的线性基! 但是我不会线性基-- (吐槽:#define double long double 才过--) #include <cstdio> ...

  9. BZOJ 4004 [JLOI2015]装备购买 ——线性基

    [题目分析] 题目很简单,就是要维护一个实数域上的线性基. 仿照异或空间的线性基的方法,排序之后每次加入一个数即可. 卡精度,开long double 和 1e-6就轻松水过了. [代码] #incl ...

随机推荐

  1. [引]LINQ to XML 类概述

    本文转自:http://msdn.microsoft.com/zh-cn/library/bb387023.aspx 本主题提供 System.Xml.Linq 命名空间中 LINQ to XML 类 ...

  2. 【转】myeclipse 上安装 Maven3

    [转]myeclipse 上安装 Maven3 环境准备: JDK 1.6 Maven 3.0.4 myeclipse 8.6.1 安装 Maven 之前要求先确定你的 JDK 已经安装配置完成.Ma ...

  3. SQL server 数据库日志文件过大清空日志文件

    SQL2008:'在SQL2008中清除日志就必须在简单模式下进行,等清除动作完毕再调回到完全模式. USE [master] GO ALTER DATABASE DBName SET RECOVER ...

  4. 使用for xml path 分组查询

     SELECT  OLevel, WorkOrgID, WorkOrgName, PlanNum, PlanFinishNum, PlanUnFinishNum, PlanCanceledNum, P ...

  5. ios llvm and clang build tools

    1. 使用 libclan g或 clang 插件 包括( libclang 和  Clangkit) 备注: Clangkit,它是基于 clang 提供的功能,用 Objective-C 进行封装 ...

  6. javascript RegExp类型 学习小记

    在js里面,可以有两种方法来定义正则表达式,第一种是通过字变量的形式,第二种则是通过构造函数的形式: 1 字变量形式,格式是长这样子的 var expression = /pattern/flag p ...

  7. Sublime Text3一些安装和使用技巧

    ST3是一款很好的编辑软件,他不仅仅是能编辑前端代码,包括JS,PHP,HTML,CSS等,还能编辑JAVA,C++等常用后代编辑语言.因为本人写前端,本篇文章只介绍ST3的一些前端的技巧. 对于ST ...

  8. Java JDK1.5、1.6、1.7新特性整理(转)

    原文链接:http://www.cnblogs.com/tony-yang-flutter/p/3503935.html 一.Java JDK1.5的新特性 1.泛型: List<String& ...

  9. ceilometer

    控制节点: ceilometer-api: /etc/init.d/openstack-ceilometer-api  status ceilometer-collector /etc/init.d/ ...

  10. Java7 switch新特性

    在Java7之前,switch只能匹配整数值,和字符:而Java7添加了字符串的匹配特性. 代码如下: package blog; public class Main { public static ...