select

来源:互联网 发布:阿里云域名优惠码口令 编辑:程序博客网 时间:2024/06/05 06:44

题面

一开始
想了一个
结果
只有40

看了题解
就是
枚举选i行,k-i列
找最大值

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<queue>#include<vector>#include<climits>#include<string>#include<cstdlib>#include<ctime>#define MOD 1000000007#define LL long longusing namespace std;LL n,m,k,p,sl[1005],sh[1005],i,j,t,kl[1000005],kh[1000005],ans=-1e18,a;priority_queue<LL> al;priority_queue<LL> ah;int main(){    freopen("select.in","r",stdin);    freopen("select.out","w",stdout);       scanf("%lld%lld%lld%lld",&n,&m,&k,&p);    for(i=1;i<=n;i++)        for(j=1;j<=m;j++)        {            scanf("%lld",&a);            sl[i]+=a;sh[j]+=a;        }    for(i=1;i<=n;i++)        al.push(sl[i]);    for(i=1;i<=k;i++)    {        t=al.top();        al.pop();        kl[i]=kl[i-1]+t;        t=t-m*p;        al.push(t);    }    for(i=1;i<=m;i++)        ah.push(sh[i]);    for(i=1;i<=k;i++)    {        t=ah.top();        ah.pop();        kh[i]=kh[i-1]+t;        t=t-n*p;        ah.push(t);    }    for(i=0;i<=k;i++)        ans=max(ans,kl[i]+kh[k-i]-i*(k-i)*p);    printf("%lld",ans);    return 0;}
原创粉丝点击