想法是先每一行都排个序 之后建立2维数组存储每一位和本行第一位的差值 先输出第0列之和(最小情况) 之后不断在存储差值的那个数组的第一列擂台比较出最小者,输出这一位加第0列之和(相当于在第零列把这一列的第一个数和这一位交换,由于他们的差值最小,所以就诞生了下一个最优解,之后交换这一位和他后面的第a位(a代表这一行的数字被作为最优解出现的次数) 个人感觉思路没问题,过了样例,但是所有数据据点都豹0
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
bool cmp(int a,int b){
return a<b;
}
int a[N][N]={},qz[N][N],ptr[N];
int main(){
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
sort(a[i],a[i]+m,cmp);
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
qz[i][j]=a[i][j]-a[i][0];
}
}
/*for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<qz[i][j]<<" ";
}
cout<<'\n';
}*/
int cnt=0;
for(int i=0;i<m;i++){
cnt+=a[i][0];
}
for(int i=0;i<m;i++){
ptr[i]=2;
}
cout<<cnt<<' ';
int mn=2147483647,wei=0,las=-2147483647;
int tme=0;
while(tme<k-1){
mn=2147483647;
for(int i=0;i<m;i++){
if(qz[i][1]==las){
swap(qz[wei][1],qz[wei][ptr[wei]]);
if(qz[i][1]<mn){
mn=qz[i][1];
wei=i;
}
continue;
}
if(qz[i][1]<mn){
mn=qz[i][1];
wei=i;
}
}
cout<<cnt+qz[wei][1]<<' ';
las=qz[wei][1];
swap(qz[wei][1],qz[wei][ptr[wei]]);
ptr[wei]++;
tme++;
}
//cout<<cnt;
return 0;
}