思路:将行和列分开考虑。用优先队列,计算出行操作i次的幸福值r[i],再计算出列操作i次的幸福值c[i]。然后将行取i次操作和列取k-i次操作,那么多加的幸福值就是i*(k-i)*p,因为无论先操作行还是列,每操作一次一个格子只减一次p。这样记录下最大的幸福值。
代码:
#includeusing namespace std;#define ll long longconst int N=1e6+5;const int M=1e3+5;const ll INF=1e18;priority_queue row,col;ll r[N],c[N];int a[M][M];int main(){ ios::sync_with_stdio(false); cin.tie(0); int n,m,k,p; cin>>n>>m>>k>>p; for(int i=0;i >a[i][j]; sum+=a[i][j]; } row.push(sum); } for(int j=0;j