zoukankan      html  css  js  c++  java
  • 【BZOJ4004】装备购买(JLOI2015)-线性基+贪心

    测试地址:装备购买
    做法:本题需要用到线性基+贪心。
    很容易看出,这题要求一个权值和最大的线性无关组,这次是真的原版线性基了,而不是异或线性基,所以为了保证精度,要开long double,而且写法也和异或线性基略有不同,详见代码。
    以下是本人代码:

    #include <bits/stdc++.h>
    using namespace std;
    int n,m,p[510];
    long double b[510][510]={0};
    const long double eps=1e-8;
    bool vis[510]={0};
    struct Vector
    {
        long double s[510];
        int c;
    }a[510];
    
    bool cmp(int x,int y)
    {
        return a[x].c<a[y].c;
    }
    
    void work()
    {
        int ans=0,tot=0;
        for(int t=1;t<=n;t++)
        {
            int i=p[t];
            for(int j=1;j<=m;j++)
                if (fabs(a[i].s[j])>eps)
                {
                    if (vis[j])
                    {
                        for(int k=j+1;k<=m;k++)
                            a[i].s[k]-=a[i].s[j]*b[j][k]/b[j][j];
                        a[i].s[j]=0.0;
                    }
                    else
                    {
                        vis[j]=1;
                        for(int k=1;k<=m;k++)
                            b[j][k]=a[i].s[k];
                        ans+=a[i].c;
                        tot++;
                        break;
                    }
                }
        }
        printf("%d %d",tot,ans);
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%Lf",&a[i].s[j]);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i].c),p[i]=i;
        sort(p+1,p+n+1,cmp);
    
        work();
    
        return 0;
    }
  • 相关阅读:
    js,jQuery实现可关闭悬浮框广告特效,兼容(谷歌,火狐,Ie)
    各种选择框jQuery的选中方法
    表单校验demo
    两种方法实现城市级联菜单
    树形菜单
    匿名函数和鼠标移入移除事件
    多线程实例
    Lock锁
    Oracle语句
    Java NIO
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793495.html
Copyright © 2011-2022 走看看