HDU 1862 EXCELソート


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 c
{
    char  num[10];
    char name[20];
    int chengji;
}a[100005];
int comp1(const void*a,const void*b)//      
{
    struct c *p1=(struct c*)a;
    struct c *p2=(struct c*)b;
    return strcmp(p1->num,p2->num);
}
int comp2(const void*a,const void*b)//      
{
    struct c *p1=(struct c*)a;
    struct c *p2=(struct c*)b;
    if(strcmp(p1->name,p2->name))
    return strcmp(p1->name,p2->name);
    else
    return strcmp(p1->num,p2->num);
}
int comp3(const void*a,const void*b)//    
{
    struct c *p1=(struct c*)a;
    struct c *p2=(struct c*)b;
    if(p1->chengji!=p2->chengji)
        return p1->chengji-p2->chengji;
    else
        return strcmp(p1->num,p2->num);
}

int main()
{
    int n,c,i,k=1;
    while(scanf("%d %d",&n,&c),n)
    {
        for(i=0;i<n;i++)
        {
            scanf("%s %s %d",a[i].num,a[i].name,&a[i].chengji);
        }
        switch(c)
        {
            case 1:qsort(a,n,sizeof(struct c),comp1);break;
            case 2:qsort(a,n,sizeof(struct c),comp2);break;
            case 3:qsort(a,n,sizeof(struct c),comp3);break;
        }
        printf("Case %d:
",k); k++; for(i=0;i<n;i++) { printf("%s %s %d
",a[i].num,a[i].name,a[i].chengji); } } return 0; }

 
分析:
やっと休みになりました!またA問題ができます!
この問題は古典的な感じがしますね.水ですが、構造体の順序が整っているような気がします.
初めて問題を見た時に条件WAを1つ少なく見て6回--!
何人かの学生が同じ名前または同じ成績を持っている場合、彼らの学号によって順番に並べ替えられます.この条件はすべてのソートに要求される.悲劇的な私が初めて見た時は3番目に...囧