【问题描述】
他决定为我们的自由市BBS算法板T恤设计后不久,XKA发现他被各种建议从板上的每个人。让每个人都完全满意确实是一件不可能的事。所以他参加了民意调查来收集人们的意见。这是他所获得的:N人投票给M设计元素(如设计LOGO,大牌在计算机科学中,著名的图,等)。每个人都给每个元素分配了一些满足感。然而,节能只能把K(<= m)的元素融入自己的设计。他需要你为他挑选K元素,使总满意度最大化。
【输入】
输入由多个测试用例组成。对于每一种情况下,第一行包含三个正整数n,m和k n是数人,M是设计元素的数目,和K元素节能数量将把他的设计。然后n行跟随,每一个包含m个数。在第i行第j个数表示第j个元素的第i个人的满意度。
【输出】
对于每一个测试案例,打印一行指标的K元素你会建议节能考虑,满意度总数量最大化。如果有多个解决方案,则必须输出具有最小索引的解决方案。索引从1开始,必须以非递增顺序打印。在两个相邻的索引之间必须有一个空格,在行的最后没有多余的空格。
【输入输出样例】
in
3 6 4
2 2.5 5 1 3 4
5 1 3.5 2 2 2
1 1 1 1 1 10
3 3 2
1 2 3
2 3 1
3 1 2
out
6 5 3 1
2 1
【源程序清单】
#include <iostream>
#include <cstdio>
#include <algorithm> using namespace std;
class data
{
public:
double num;
int c;
};
data b[500];
double a[500][500];
int cmp1(const data a, const data b) //结构体的从大到小排序
{
return a.num > b.num;
}
int cmp2(const int a, const int b) //从大到小排序
{
return a > b;
}
int main()
{
int n, m, k;
int i, j;
int ans[1000];
while(scanf("%d%d%d", &n, &m, &k) != EOF)
{
for(i = 0; i < n; i++) //输入
for(j = 0; j < m; j++)
scanf("%lf", &a[i][j]);
for(i = 0; i < m; i++) //算出各个元素的满意度,
{
b[i].num = 0.0;
b[i].c = i + 1; //标记编号,避免排序后乱了
for(j = 0; j < n; j++)
{
b[i].num += a[j][i];
}
}
sort(b, b + m, cmp1); //排序
for(i = 0; i < k; i++) //取前K个元素的标号
ans[i] = b[i].c;
sort(ans, ans + k, cmp2); //排序,
for(i = 0; i < k; i++)
i == k - 1 ? cout << ans[i] << endl : cout << ans[i] << ' ';
}
return 0;
}