【JLOI2015】bzoj4004 装备购买
2017-01-31 17:28
369 查看
Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,…..,am)
表示 (1 <= i <= n; 1 <= j <= m),每个装备需要花费 ci,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着
怎样才能花尽量少的钱买尽量多的装备。对于脸哥来说,如果一件装备的属性能用购买的其他装备组合出(也就是
说脸哥可以利用手上的这些装备组合出这件装备的效果),那么这件装备就没有买的必要了。严格的定义是,如果 脸哥买了 zi1,…..zip这
p 件装备,那么对于任意待决定的 zh,不存在 b1,….,bp 使得 b1zi1 + … + bpzi p = 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 一行两个数,第一个数表示能够购买的最多装备数量,第二个数表示在购买最多数量的装备的情况下的最小花费
跟bzoj3105【见这里】很像,不过那里的权值是自身大小,这里的权值是给定的,但是并不影响。另外就是异或变成了一般的向量加减。
原始数据double随便写,但是bzoj加强了以后要开long double。
表示 (1 <= i <= n; 1 <= j <= m),每个装备需要花费 ci,现在脸哥想买一些装备,但是脸哥很穷,所以总是盘算着
怎样才能花尽量少的钱买尽量多的装备。对于脸哥来说,如果一件装备的属性能用购买的其他装备组合出(也就是
说脸哥可以利用手上的这些装备组合出这件装备的效果),那么这件装备就没有买的必要了。严格的定义是,如果 脸哥买了 zi1,…..zip这
p 件装备,那么对于任意待决定的 zh,不存在 b1,….,bp 使得 b1zi1 + … + bpzi p = 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 一行两个数,第一个数表示能够购买的最多装备数量,第二个数表示在购买最多数量的装备的情况下的最小花费
跟bzoj3105【见这里】很像,不过那里的权值是自身大小,这里的权值是给定的,但是并不影响。另外就是异或变成了一般的向量加减。
原始数据double随便写,但是bzoj加强了以后要开long double。
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> using namespace std; #define double long double const double eps=1e-5; struct str { double a[510]; int v; bool operator < (const str &s) const { return v<s.v; } }a[510]; int n,m,f[510]; int main() { ios::sync_with_stdio(0); int i,j,k,ans1=0,ans2=0; double x; cin>>n>>m; for (i=1;i<=n;i++) for (j=1;j<=m;j++) cin>>a[i].a[j]; for (i=1;i<=n;i++) cin>>a[i].v; sort(a+1,a+n+1); for (i=1;i<=n;i++) for (j=1;j<=m;j++) if (fabs(a[i].a[j])>eps) { if (!f[j]) { f[j]=i; ans1++; ans2+=a[i].v; break; } else { x=a[i].a[j]/a[f[j]].a[j]; for (k=j;k<=m;k++) a[i].a[k]-=a[f[j]].a[k]*x; } } cout<<ans1<<" "<<ans2<<endl; }
相关文章推荐
- 【bzoj2460】 BeiJing2011—元素
- BZOJ 4568 幸运数字
- 【BZOJ4269】再见Xor
- 【BeiJing2011】【BZOJ2460】元素
- BZOJ 2460 [BeiJing2011] 元素
- BZOJ 3569 询问删除指定的k条边后图是否连通 线性基
- BZOJ 4568 倍增维护线性基
- hdu3949 XOR
- bzoj2844 albus就是要第一个出场
- 【WC2011】bzoj2115 Xor
- 【CQOI2013】bzoj3105 新Nim游戏
- BZOJ2115 Xor
- BZOJ2844 albus就是要第一个出场
- Bzoj 2115: [Wc2011] Xor
- Bzoj 2460: [BeiJing2011]元素
- [BZOJ4184]shallot(线段树+线性基)
- [BZOJ2844]albus就是要第一个出场(线性基)
- bzoj 2460: [BeiJing2011]元素
- bzoj 2115: [Wc2011] Xor
- HDU 3949 XOR