zoukankan      html  css  js  c++  java
  • [JLOI2015]装备购买

    洛咕

    题意:n个装备,每个装备m个属性,每个装备还有个价格.如果已经拥有的装备的每一项属性 为它们分配系数(实数)后 可以相加得到某件装备,则不必要买这件装备.求最多装备下的最小花费.

    分析:n行m列的矩阵,每个装备的花费可以看作在m+1列上,但实际上花费与装备属性没有半毛钱关系.

    直接贪心策略,每一次选定花费最小的装备,用它去消其它还没有确定买不买的装备,如果某一个装备被消为了0,则可以不买.

    #include<bits/stdc++.h>
    using namespace std;
    inline int read(){
       int s=0,w=1;char ch=getchar();
       while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
       while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
       return s*w;
    }
    long double eps=1e-8,a[505][505];
    int tot,ans,val[505];
    int main(){
        int n=read(),m=read();
        for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    	    	a[i][j]=read()*1.0;
        for(int i=1;i<=n;i++)val[i]=read();
        for(int i=1;i<=n;i++){
    		int now=0;
    		for(int j=tot+1;j<=n;j++)
    	    	if((fabs(a[j][i])>eps)&&(now==0||val[j]<val[now]))now=j;
    //找到当前最小花费的装备
    		if(now==0)continue;
    //如果它已经被消为了0,则不买它,直接跳过
    		tot++;ans+=val[now];
    //否则,tot记录买的装备个数,ans记录花费
    		for(int j=1;j<=m;j++)swap(a[now][j],a[tot][j]);
    		swap(val[now],val[tot]);
    //把当前买的这一行装备交换到第tot行
    //这里实际上使得前tot行都是确定要买的装备
    //所以之后的枚举中可以不考虑它们了
    		for(int j=tot+1;j<=n;j++){
    	    	if(fabs(a[j][i])>eps){
    				long double cnt=a[j][i]*1.0/a[tot][i];
    				for(int k=i;k<=m;k++)a[j][k]-=cnt*a[tot][k];
    	    	}
    		}
    //用当前买的这件装备去消其它装备
        }
        printf("%d %d
    ",tot,ans);
        return 0;
    }
    
    
  • 相关阅读:
    stm32 SPI DMA读取ADS8345数据
    Minigui3.0.12完美安装,折腾了一天。终于看到了
    qvfb2的安装,在ubuntu10.4上安装成功
    户口从杭州人才市场迁移到武汉万科魅力之城的过程
    禁止minigui 3.0的屏幕保护
    想穿越回到儿时记录那些幸福
    TIM2定时闪灯程序。。。
    关于minigui的皮肤控件无法显示问题
    插件框架内核的设计
    用“序列图”描述技术方案
  • 原文地址:https://www.cnblogs.com/PPXppx/p/10628215.html
Copyright © 2011-2022 走看看