首页 > 其他 > 详细

装备购买(线性基)

时间:2019-10-07 16:10:47      阅读:99      评论:0      收藏:0      [点我收藏+]

题目链接

https://www.acwing.com/problem/content/description/211/

算法:先贪心,然后高斯消元算出基底的个数

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=505;
#define PII pair<int,int>
const int INF=2e9; 
const int mod=1e9+7;
ll power(ll a,ll b)
{
    ll ans=1;
    for(;b;b>>=1)
    {
        if(b&1)
            ans=ans*a%mod;
        a=a*a%mod;
    }
    return ans;
}
ll inv(ll x)
{
    return power(x,mod-2);
}
struct hp{
    ll a[N];
    int val;
};
hp ma[N];
int b[N],n,m,cnt,ans;
int cmp(const hp &a,const hp &b)
{
    return a.val<b.val;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>ma[i].a[j];
            ma[i].a[j]%mod;
        }
    }
    for(int i=1;i<=n;i++)
    {
        cin>>ma[i].val;
    }
    sort(ma+1,ma+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(ma[i].a[j])
            {
                if(!b[j])
                {
                    b[j]=i;
                    ++cnt;
                    ans+=ma[i].val;
                    break;
                }
                else
                {
                    ll t=ma[i].a[j]*inv(ma[b[j]].a[j])%mod;
                    for(int k=j;k<=n;k++)
                    {
                        ma[i].a[k]=((ma[i].a[k]-ma[b[j]].a[k]*t%mod)%mod+mod)%mod;
                    }
                }
            }
        }
    }
    cout<<cnt<<" "<<ans<<"\n";
    return 0;
 } 

 

装备购买(线性基)

原文:https://www.cnblogs.com/hh13579/p/11630599.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!