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を超えない非負の整数である.
ネット上で巧妙な実現方法を見たのは以下の通りです.
注意:1、qsort(num,n,sizeof(num[0])、cmp);qsortの2番目のパラメータは、個数を比較する必要があり、2次元配列であるが、ソートは1行単位であるため、nである.n*2を記入すると、結果は間違いありませんが、ccfは60点しかありません.2、cmpの書き方について、ここで2回並べ替えた
#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回並べ替えた