Problem:
ある学校で修学旅行へ行く計画がある.そのためにアンケート調査を行った.
生徒は 1 から n までの生徒番号を持ち,旅行候補の場所を 1 から m までの番号で表し,行きたい場所に ○,行きたくない場所に×の印をつけて提出している.

このとき, 行きたい場所の人数が多い順に,場所の番号を出力するプログラムを作成せよ.人数が同じときは,場所の番号順とする.

入力データ の 1 行目は生徒の人数 n と旅行候補の場所の数 m が空白で区切られ, i + 1 行に生徒 i のアンケート結果を ○ は 1 で×は 0 で表し,空白で区切られた m 個の数字が並んでいる.1 ≤ n ≤ 1000, 1 ≤ m ≤ 100 とする.

入力例１

4 6

1 0 1 0 1 1

1 1 0 1 0 0

1 1 1 0 0 0

1 0 1 0 1 0

　

出力例１

1 3 2 5 4 6

入力

入力は複数のデータセットからなる．n, m がともに 0 のとき入力が終了する．データセットの数は 5 を超えない．

出力

データセットごとに、場所の番号 を１行に出力する．

入力例

4 6
1 0 1 0 1 1
1 1 0 1 0 0
1 1 1 0 0 0
1 0 1 0 1 0
4 6
1 0 1 0 1 1
1 1 0 1 0 0
1 1 1 0 0 0
1 0 1 0 1 0
0 0

出力例

1 3 2 5 4 6
1 3 2 5 4 6

上記問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in C (judge verdict: Accepted)

#include <stdio.h>

struct KOUZOUTAI0505
{
	int num;
	int request;
};
typedef struct KOUZOUTAI0505 kouzoutai0505;

void display(kouzoutai0505 data[], int m);
void sort00(kouzoutai0505 data[], int m);					//配列の中身を.requestで降順に並べ替える関数。mは要素数。
void sort01(kouzoutai0505 data[], int m);					//配列の中身の.requestが同じものを、.numで昇順に整頓する関数。mは要素数。
int maxidx00(kouzoutai0505 data[], int from, int to);

int main()
{
	int n,m;
	int i,k;
	int x;
	kouzoutai0505 data[100];
	while(1){
		scanf("%d %d", &n, &m);
		if(n==0&&m==0){
			break;
		}
		for(i=0; i<n; i++){
			for(k=0; k<m; k++){
				if(i==0){									//初回(i==0)時は.numを割り振る。
					data[k].num=k;
					data[k].request=0;
				}
				scanf("%d", &x);
				if(x){
					data[k].request++;
				}
			}
		}
		sort00(data, m);
		sort01(data, m);
		display(data, m);
	}
	return 0;
}



void display(kouzoutai0505 data[], int m){
	int i;
	for(i=0; i<m; i++){
		if(i>0){
			printf(" ");
		}
		printf("%d", data[i].num+1);
	}
	printf("\n");
	return;
}

void sort00(kouzoutai0505 data[], int m){					//配列の中身を.requestで降順に並べ替える関数。mは要素数。
	kouzoutai0505 work;
	int i;
	int idx;
	for(i=0; i<m; i++){
		idx = maxidx00(data, i, m);
		work = data[i];
		data[i] = data[idx];
		data[idx] = work;
	}
	return;
}

void sort01(kouzoutai0505 data[], int m){
	kouzoutai0505 work;
	int i;
	int count=1;
	while(1){
		if(count==0){
			break;
		}
		count=0;
		for(i=0; i<m; i++){
			if(data[i].request==data[i+1].request){
				if(data[i].num>data[i+1].num){
					work = data[i];
					data[i] = data[i+1];
					data[i+1] = work;
					count++;
				}
			}
		}
	}
	return;
}

int maxidx00(kouzoutai0505 data[], int from, int to){
	int i;
	int idx=from;
	for(i=from; i<to; i++){
		if(data[idx].request<data[i].request){
			idx=i;
		}
	}
	return idx;
}