CCF 201503-2デジタルソート

5283 ワード

問題記述問題番号:201503-2問題名:数字並べ替え時間制限:1.0 sメモリ制限:256.0 MB問題説明:問題記述所与のn個の整数、各整数の出現回数を統計して、出現回数が多い順に出力してください.入力フォーマット入力の最初の行には、所定の数値の個数を表す整数nが含まれる.2行目はn個の整数を含み、隣接する整数の間に1つのスペースで区切られ、与えられた整数を表す.出力フォーマットは複数行を出力し、各行には2つの整数が含まれ、それぞれ1つの与えられた整数とその出現回数を表す.出現回数の減少順に出力します.2つの整数が同じ回数である場合、出力値が小さいものから大きいものを出力します.サンプル入力12 5 2 3 3 3 1 3 4 2 5 5 5サンプル出力3 4 2 3 5 3 1 4 1評価用例規模と約1≦n≦1000であり、与えられた数はいずれも1000を超えない非負の整数である.
#include 
#include 
int num[1000][2];
int a[1000];
//       
int cmp(const void *i,const void *j){
    int *a= (int *)i; //a    num[i]   ,        
    int *b = (int *)j;

    //(*a)   ,*(a+1)    
    if( *(a+1)== *(b+1) ){
        return (*a)-(*b);
    }else return  *(b+1)-*(a+1);
}
int main(){
    int n;
    scanf("%d",&n);
    int i,j;
    for(i=0;iscanf("%d",&a[i]);
    }
    //    
    for(i=0;i0]=a[i];
        num[i][1]=1;
        for(j=i+1;jif(a[i]==a[j]){
                num[i][1]++;
                a[j]=-1;
            } 
        }

    }
    qsort(num,n,sizeof(num[0]),cmp);
    //       ,       ,        ,          ,   n;
    //    n*2,    , ccf  60 。 

    for(i=0;iif(num[i][0]!=-1){
        for(j=0;j<2;j++){

            printf("%d ",num[i][j]); 
        }
        printf("
"
); } } return 0; }

ネット上で巧妙な実現方法を見たのは以下の通りです.
#include 
#include 
#include 
int a[1005];
int main(){
    int n;
    scanf("%d",&n);
    int i,j;
    int u;
    memset(a,0,sizeof(a));
    for(i=0;iscanf("%d",&u);
        a[u]++; 
    }

    for(i=1004;i>0;i--){//     ,     
        for(j=0;j<1005;j++){//    ,       
            if(a[j]==i){
                printf("%d %d
"
,j,i); } } } return 0; }

注意:1、qsort(num,n,sizeof(num[0])、cmp);qsortの2番目のパラメータは、個数を比較する必要があり、2次元配列であるが、ソートは1行単位であるため、nである.n*2を記入すると、結果は間違いありませんが、ccfは60点しかありません.2、cmpの書き方について、ここで2回並べ替えた