杭電1862 EXCELソート

2824 ワード

EXCELソート

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 14601    Accepted Submission(s): 5630
Problem Description
Excelでは、レコードのセットを任意の指定された列でソートできます.プログラムを作成して類似の機能を実現してください.
 
Input
テスト入力には、いくつかのテスト例が含まれます.各試験例の第1行は、2つの整数N(<=10000000)とCを含み、ここで、Nはレコードのストライプ数であり、Cは指定されたソートの列番号である.以下N
行、各行に学生記録が含まれています.各学生レコードは、学号(6桁の数字で、同じグループのテストで重複していない学号)、氏名(8桁を超えずスペースを含まない文字列)、成績(閉区間[0,100]内の整数)で構成され、各項目間は1つのスペースで区切られている.N=0と読むと全ての入力が終了し、対応する結果は出力されない.
 
Output
各テストケースについて、まず1行「Case i:」を出力し、ここでiはテストケースの番号(1から)である.次に、N行において、C=1の場合、学号で並べ替えられる.C=2の場合、名前の非減算辞書順に並べ替える.C=3の場合
の場合は、成績の非減算順に並べ替えます.何人かの学生が同じ名前または同じ成績を持っている場合、彼らの学号によって順番に並べ替えられます.
 
Sample Input

        
        
        
        
3 1 000007 James 85 000010 Amy 90 000001 Zoe 60 4 2 000007 James 85 000010 Amy 90 000001 Zoe 60 000002 James 98 4 3 000007 James 85 000010 Amy 90 000001 Zoe 60 000002 James 90 0 0

 
Sample Output

        
        
        
        
Case 1: 000001 Zoe 60 000007 James 85 000010 Amy 90 Case 2: 000010 Amy 90 000002 James 98 000007 James 85 000001 Zoe 60 Case 3: 000001 Zoe 60 000007 James 85 000002 James 90 000010 Amy 90

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct person{
	char number[7];
	char name[9];
	int grades;
}s[100010]; 

int cmp1(const void *a,const void *b){
	return strcmp((*(person *)a).number,(*(person *)b).number);
}

int cmp2(const void *a,const void *b){
	if(strcmp(((*(person *)a).name),((*(person *)b).name))==0) return strcmp((*(person *)a).number,(*(person *)b).number);
	return strcmp(((*(person *)a).name),((*(person *)b).name));
}

int cmp3(const void *a,const void *b){
	if(((*(person *)a).grades)==((*(person *)b).grades)) return strcmp((*(person *)a).number,(*(person *)b).number);
	return ((*(person *)a).grades)-((*(person *)b).grades);
}

int main(){
	int n,c;
	int j=0;
	while(scanf("%d%d",&n,&c),n){
		int i;
		for(i=0;i<n;i++){
			scanf("%s %s %d",s[i].number,s[i].name,&s[i].grades);
		}
		printf("Case %d:
",++j); if(c==1){ qsort(s,n,sizeof(s[0]),cmp1); } if(c==2){ qsort(s,n,sizeof(s[0]),cmp2); } if(c==3){ qsort(s,n,sizeof(s[0]),cmp3); } for(i=0;i<n;i++){ printf("%s %s %d
",s[i].number,s[i].name,s[i].grades); } } return 0; }