本题比较基础,将数据读入二维数组,计算每一列的和,从大到小排序,记录索引,再将索引从大到小排序输出即可。
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 10010;
struct element
{
int index;
double satisfaction;
};
element Num[MAX][MAX]; //读入数据
element Sum[MAX]; //存储最大的K个数据
int Out[MAX]; //将最大的K个数据按顺序从大到小排列
int cmp1(const element a, const element b)
{
return a.satisfaction > b.satisfaction;
}
int cmp2(const int a, const int b)
{
return a > b;
}
int main()
{
int N, M, K;
while (cin >> N >> M >> K)
{
double num;
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= M; j++)
{
cin >> num;
Num[i][j].satisfaction = num;
}
}
double sum;
for (int j = 1; j <= M; j++)
{
sum = 0;
for (int i = 1; i <= N; i++)
{
sum += Num[i][j].satisfaction; //计算每一列的和
}
Sum[j].index = j; //存储索引
Sum[j].satisfaction = sum; //存储此列的和
}
sort(Sum + 1, Sum + M + 1, cmp1); //将列之和的数组排序
for (int i = 1; i <= K; i++)
Out[i] = Sum[i].index; //存储列之和最大的K个列的索引
sort(Out + 1, Out + K + 1, cmp2); //将列的索引排序
for (int i = 1; i < K; i++)
cout << Out[i] << " ";
cout << Out[K] << endl;
}
return 0;
}
继续加油。