思路:这道题可以用DP写也可以用优先队列写,我用的是优先队列,首先就是将每一天的价格sort排序,至于格外要支付k*k的费用只需要将数组处理一下就好,a[i][j] = a[i][j]+2*j+1;
然后按天数把当天的所以糖果的价格放入优先队列,再将最先出队的买了,这样就可以保证费用少。
#include <bits/stdc++.h>
using namespace std;
int a[310][310];
priority_queue<int,vector<int>,greater<int> >q;
//定义一个优先队列,
int main()
{
int n,m; cin>>n>>m;
int sum = 0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
sort(a[i],a[i]+m);
for(int j=0;j<m;j++){
a[i][j] = a[i][j]+2*j+1;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
q.push(a[i][j]);
}
sum += q.top();
q.pop();
}
cout<<sum<<endl;
return 0;
}