转载出自 https://blog.csdn.net/c_13579/article/details/83039005
贪心不行,数学思维寻找它的选取规律
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#define maxn 1005
#define INF 0x3f3f3f3f
#define LL long long
#define PI 3.1415926
#define e 2.7182818
using namespace std;
int n,m,k;
LL a[maxn][maxn];
LL qz[maxn][maxn];
bool cmp(int a,int b)
{
return a>b;
}
struct node
{
LL sum;
int id;
friend bool operator <(node a,node b)
{
return a.sum<b.sum;
}
}s[maxn];
int main()
{
//ios::sync_with_stdio(false);
cin>>n>>m>>k;
LL ans,now;
ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
sort(a[i]+1,a[i]+m+1,cmp);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
qz[i][j]=qz[i][j-1]+a[i][j];
}
ans+=qz[i][m];
s[i].sum=qz[i][m];
s[i].id=i;
}
sort(s+1,s+1+n);
int cnt=0;
for(int i=1;i<=n;i++)
{
cnt=0;
now=qz[i][k%m];
for(int j=1;j<=n;j++)
{
if(cnt==k/m)
break;
if(s[j].id==i&&k%m)
continue;
now+=s[j].sum;
cnt++;
}
ans=min(ans,now);
}
cout << ans << endl;
return 0;
}