杭電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;
}
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
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;
}