标签:style blog http color os io for ar art
D 题说的是给了一个矩阵 然后又k 次操作每次能把一整行 或者一整列 中的每个元素都减去p 然后 加上减去之前的该行和该列, 傻逼的我有没有做出来, 我们可以知道最后结果横的用了x次 竖的用了y次 那么他们用的先后顺序是没有影响的,然后预处理出 横取1 --- k次的最大值 和 竖取 1---k次的最大值 然后枚举x 相应的进行处理就到了最后的答案
#include <iostream> #include <cstdio> #include <string.h> #include <queue> #include <algorithm> using namespace std; const int maxn = 1005; __int64 Martix[maxn][maxn],n,m,k,p; __int64 R[maxn*1000],C[maxn*1000]; __int64 maxv(__int64 a,__int64 b) { return a>b?a:b; } int main() { priority_queue<__int64>row,cloun; while(scanf("%I64d%I64d%I64d%I64d",&n,&m,&k,&p)==4) { for(int i =0;i<n; ++i) for(int j=0; j<m; ++j) scanf("%I64d",&Martix[i][j]); for(int i= 0; i<n; ++i) { __int64 a=0; for(int j=0; j<m; ++j) a+=Martix[i][j]; row.push(a); } for(int i=0; i<m; ++i) { __int64 a=0; for(int j = 0; j<n; ++j) a += Martix[j][i]; cloun.push(a); } R[0]=0; __int64 ans=0; for(int i=1 ; i<=k; ++i ) { __int64 rt =row.top();row.pop(); ans+=rt; R[i]=ans; rt-=m*p; row.push(rt); } C[0]=0; ans=0; for(int i =1; i<=k; ++i) { __int64 rt =cloun.top();cloun.pop(); ans+=rt; rt-=n*p; C[i]=ans; cloun.push(rt); } ans=-1000000000000000000; for(__int64 i =0; i<=k; ++i) { __int64 t = R[i]+C[k-i]; __int64 e = p*i*(k-i); t =t-e; ans=maxv(ans,t); } printf("%I64d\n",ans); while(!row.empty())row.pop(); while(!cloun.empty())cloun.pop(); } return 0; }
标签:style blog http color os io for ar art
原文地址:http://www.cnblogs.com/Opaser/p/3855946.html